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…
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…
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.
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.