Existe padrão para classes DAO?

13 respostas
dsiviotti

Existe alguma forma padrão de se fazer uma classe DAO? Quero dizer, métodos insert, delete etc… ou um método que retorne uma lista de registros? Existe alguma classe que possa ser extendida para isso?
Estou fazendo esta pergunta porque andei vendo alguns itens sobre Hibernate e imaginei que poderia migrar uma classe DAO do código SQL para algum tipo de permanência sem que a classe de negócio sentisse nenhuma diferença.
Acho que essa é a idéia, não?

13 Respostas

dgouvea

Se você quiser persistir os dados em componentes de negócio utilize os EJBs Entity CMP. Eles são especificos para a persistência, e são bem simples.

cv1

:shocked!:

E nao percam, no proximo bloco, o dgouvea vai explicar pra gente que resolver qualquer problema de xadrez em O(1) eh a coisa mais trivial do mundo. :smiley:

Serio, nao dava pra ter dado um conselho mais esquisito nao? Da pra chamar Entity Bean CMP de qualquer coisa, menos de simples…

Duvida? Ta aqui o diagrama do ciclo de vida do bicho:

Uma ideia mais sensata seria dar uma olhada na implementacao de DAO (que, alias, foi renomeado pra Table Data Gateway ;)) que tem no J2EE Core Patterns e no Patterns Of Enterprise Application Architecture. Ambos otimos livros sobre o assunto, e geralmente a melhor fonte pra buscar esse tipo de conhecimento :wink:

dgouvea

eu entendo que a classe de negócio que o dsiviotti se refere seja um EJB. Se ele está usando um EJB qual o problema de usar um Entity CMP. Ta certo que tem suas desvantagens de não poder executar consultas complexas, mas acredito que não haveria problemas. Pode ser chato ficar configurando os arquivos XML, mas não é nenhum bicho de sete cabeças. :wink:

cv1

Gézus! :shock: Acho que eu perdi o memorando que dizia que so se colocava regra de negocio dentro de EJB :D

Ah, mais uns links, falando sobre DAOs, Hibernate e Cia Ltda.:

:arrow: http://www.hibernate.org/110.html

public class ProductDaoImpl extends HibernateDaoSupport implements ProductDao {

  public List loadProductsByCategory(String category) {
    return getHibernateTemplate().find(
     "from test.Product product where product.category=?", category,
     Hibernate.STRING);
  }
}

(fala que isso nao eh lindo! :D)

:arrow: http://forum.hibernate.org/old/909428.html - DAO Examples for Hibernate

dgouvea

Blz eu ASSUMO que interpretei mal o post. :oops:

cv1

Relaxa, dgouvea :wink: - eu nao tomei cafe ainda (viciado em cafeina eh uma merda…) e a essa hora da manha o cerebro nao ta funcionando direito. Fica dificil ser simpatico nessas horas :smiley:

Douglas

O que seria desse fórum sem o CV ?? :smiley:

dsiviotti

Na verdade, estava falando de uma classe DAO genérica, com ou sem EJB.
Estive olhando o exemplo de uso do Hibernate e os fontes do GUJ2 e reparei que os DAOs seguem um padrão. Digo, alguns métodos em comun. Era a isso que eu me referia.
Tendo médodos em comum achei que poderia haver uma classs “CustomDAO” ou uma interface para seguir o modelo ou simplesmente é uma prática de programação fazer métodos como “insert”, “delete” “getList” etc…
Valeu pela atenção…

Ironlynx

Jah leu aqui?
http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html

Daniel_Quirino_Olive

“dsiviotti”:
Na verdade, estava falando de uma classe DAO genérica, com ou sem EJB.
Estive olhando o exemplo de uso do Hibernate e os fontes do GUJ2 e reparei que os DAOs seguem um padrão. Digo, alguns métodos em comun. Era a isso que eu me referia.
Tendo médodos em comum achei que poderia haver uma classs “CustomDAO” ou uma interface para seguir o modelo ou simplesmente é uma prática de programação fazer métodos como “insert”, “delete” “getList” etc…
Valeu pela atenção…

Existe um padrão (se é que pode ser chamado de padrão) chamado CRUD (Create, Retrieve, Update, Delete). Uma boa referência: http://www.javaworld.com/javaworld/jw-03-2002/jw-0301-dao.html

Ironlynx

dsiviotti,
jah foi discutido algo semelhante aqui:
http://www.guj.com.br/forum/viewtopic.php?t=6734 :wink:

dsiviotti

Ok, o assunto clareou bastante.
Mas o DAO deve ser genérico ou não?

public java.util.List selectAlunos(Object turma){ 
    if (!(turma instanceof Turma)) 
            throw AlgumaException(""); 
     else { 
            Turma t = (Turma)turma; 
            // etc etc... 
     } 
}

ou

public java.util.List selectAlunos(Turma turma){ 
           // etc etc... 
     } 
}
dgouvea

Não precisa usar os parâmetros como Object, pode colocar direto o tipo da Classe como vc fez no segundo exemplo.

Criado 27 de janeiro de 2004
Ultima resposta 29 de jan. de 2004
Respostas 13
Participantes 6