DAO vs. Relacionamentos

Olá pessoal,

Estou estudando o Pattern DAO, vou fazer uma lojinha virtual através dele. No meu banco de dados eu tenho relacionamentos do tipo:

Categoria 1 — * Produto

Então talvez fosse interessante colocar na classe Categoria, um método mais ou menos assim:

class Categoria {
   //get/set da vida

   List getProdutos() {
      ...
   }
}

Porem, eu fazendo isso eu tornaria meu objeto de negocio atrelado à parte de acesso a dados, então eu pensei em usar interfaces. Assim onde eu fosse implementar CloudscapeCategoryDAO(), OracleCategoryDAO(), eu tb implementaria uma classe Categoria que implementasse a interface que tem os métodos do objeto de negocio categoria (que teria get/set de Nome, Descricao e um getProdutos() ).

O que vcs acham dessa abordagem? Com isso estaria saindo do Pattern DAO? Pois pelos exemplo que vi, não existe a interface, só a classe.

Nota eu não estou usando nenhum framework do tipo Hibernate, pois eu estudando…

Agradeço qq ajuda.

Existem várias formas de resolver o seu problema.

Teu dao pode carregar de antemão os produtos da categoria, e passar pra ela o List. Isso porêm fica lento se não forem usar esses produtos sempre.

Outra solução é o dao ler somente as PKs, criar 1 List esperto se vira para carregar quando necessario os dados objetos e entregar pro objeto Categoria.

Uma opção ainda é uma variação do modelo acima, onde o relacionamento é lido somente no primeiro uso da coleção.

Ou ainda seu objeto Categoria pode explicitamente chamar o DAO que criou ele para pegar as coleções, pessoalmente acho essa a pior das opções.

Cuidado, fazendo isso vc ta implementando seu próprio mini ORM…

Apesar de ter pouca experiência com essa Pattern, usar interfaces para DAOs me parece um ótimo contrato a ser estabelecido.

Mas … porquê você não usa Hibernate? :smiley:

Olá,

Acredito que o Hibernate seja uma boa opção. Mas mesmo assim eu prefiro abstrair ele também.

Esta parte de retornar um list de produtos dentro da classe de categoria deve ficar no teu modelo (regra de negocio) e não no DAO, se você colocar no DAO estará quebrando o modelo e deixando um dependente do outro.

]['s

Na verdade não estou usando Hibernate, pois só estou estudando o Pattern, depois que finalizar isso vou adaptar para usar o Hibernate, só para estudo mesmo.

louds:

Vc dizendo fica algo assim:

class Categoria { 
   //get/set da vida 
   private List l = null;  
   List getProdutos() {
       if (l == null) { 
          DAOFactory factory = ...
          l = factory.getProdutoDAO().getProductsByCategory(this.id);
       }
       return l;
   } 
}

? Mas ai estaria colocando o DAO no model, não seria um “anti-pattern”?

fabgp2001:

Tem como vc colocar um pequeno trecho de código de como ficaria a solução para a abstração do Hibernate?

Nota: acho que vou fazer só usando os XXXDAO, na classe ProdutoDAO coloco um metodo do tipo getProdutoByCategory(int id). Pelos que estou vendo, é dificil alguem fazer isso.

Obrigado pelas dicas pessoal.

g_labega, pelo contrario, eu estava sugerindo formar de exatamente evitar isso!

class SqlCategoriaDao {
   Categoria findByPk(int pk) {
         Categoria cat = new Categoria();
         //select * from categoria where id = pk 
         cat.setItens(new SmartCollection(this, pk));
         return cat;
   }
}

class SmartCollection implements List {
  private int pk;
  private CategoriaDao dao;
  private List dados = null;
  //..construtor;;;

 public int size() {
   loadData();
   return dados.size();
 }

 public Iterator iterator() {
   loadData();
   return dados.iterator();
 }

  private void loadData() {
   if(dados == null) {
    dados = dao.loadItensFromCategoria(pk);
   }
  }
}