Artigo: Don't repeat the DAO

Artigo no DeveloperWorks, que explica como utilizar Generics, com Hibernate para escrever o seu DAO de forma mais genérica…
http://www-128.ibm.com/developerworks/java/library/j-genericdao.html?ca=drs-

Isto já vem sendo abordado a algum tempo, no blog da caelum tem um artigo sobre DAO + Generics:

Mas o que me chamou a atenção para o artigo do developerworks, é utilizar o SpringAOP para encapsular determinada interface como um proxy, e fornecer uma implementação dela em runtime, utilizando algumas convenções…

Então no artigo, a seguinte interface é utilizado no código normalmente, sem ser necessário implementá-la:

public interface PersonDao extends GenericDao<Person, Long> {
    List<Person> findByName(String name);
}

E utilizando “convention over configuration” o arquivo XML do Hibernate é utilizada para buscar os dados… Como o nome da query é findByName e o nome do método também, a query do XML é automaticamente executada.

<query name="Person.findByName">
         <![CDATA[select p from Person p where p.name = ? ]]>
     </query>

O exemplo é simples, mas o que os colegas do guj pensam em utilizar este tipo de recurso?

O código fica limpo e claro, ou pq está na moda, ou vocês acham isto “too much magic” ? Esse seria um caso bom para o uso de AOP?

Não gosto dessa abordagem que define o tipo do DAO direto na instância, acho que o DAO tem que ser definido na chamada do método, fica bem menos verbose.

Mauricio, poderia elaborar mais?

Gostei do artigo. Mas o FinderIntroductionAdvisor poderia ser facilmente substituido por uma dynamic proxy das interfaces filhas de GenericDao. Dynamic proxy é bem menos intrusivo (bem, ao menos é do jdk), e serve perfeitamente ai.

Mas isso nao vai resolver alguns casos que sao até simples, aqueles em que precisamos gerar HQLs dinamicamente (onde Criteria seria mais indicado, pois nao ficariamos concatenando strings…)

O artigo já está meio velhinho (é de maio), mas o pessoal do Hibernate também mantém uma página com o assunto no wiki do projeto

http://hibernate.org/328.html

[quote=plentz]O artigo já está meio velhinho (é de maio), mas o pessoal do Hibernate também mantém uma página com o assunto no wiki do projeto

http://hibernate.org/328.html[/quote]

Tb acho meio antigo o artigo. O Maurício Linhares ja havia escrito um artigo aqui no GUJ sobre hibernate avançado que tratava o uso dos DAOs+Hibernate+Spring ! O artigo sofreu algumas criticas porque nao se aconselhava o uso de hibernate + DAO, e infelizmente o artigo parece que foi retirado.

A Caelum retirou a factory, nao acho certo, pois vejo o seguinte problema:

Eu nao consegui seguir o exemplo da Caelum porque nao entendi essa parte do codigo:

Dao<Cliente> clienteDao = new Dao<Cliente>(session);

Se Dao é uma interface… como ele conseguiu criar essa instancia: new Dao…

public interface UsersDao extends Dao<Users> {
	public List<Users> findUserByNameAndPassword(Users user);
	public List<Users> sortedList();
}

Mesmo que eu consiga criar a instancia… Como acessar esses metodos se eu vou instancia a Dao ao inves de UsersDAO.

é. instanciar interfaces é COOOOL :P.

ta errado o mesmo, o correto ai seria instanciar o HibernateGenericDao.

Sim, a gente usa a factory com um monte de getters, mas no artigo iria ficar enorme os exemplos…

[quote=Paulo Silveira]é. instanciar interfaces é COOOOL :P.
ta errado o mesmo, o correto ai seria instanciar o HibernateGenericDao.
[/quote]
rsrs :wink: normal… entendo que tenha sido um erro de digitação na verdade, percebi que no blog ja esta corrigido.
Queria abordar um assunto discuto no blog de vcs sobre o mesmo artigo que esse rapaz escreveu.

Porque mau uso de herança ?
Como aplicar polimorfismo nesses DAOs ?

**** editado ******
Desculpa… achei melhor criar outro topico, afinal o assunto da noticia parece ser outro
http://www.guj.com.br/posts/list/0/43672.java#230424

Poderia citar um trecho usando DAO com Dynamic proxy ?
Eu na verdade nao sabia o que era isso e dei uma pesquisa lendo esse artigo:
http://java.sun.com/j2se/1.3/docs/guide/reflection/proxy.html

Creio que seja uma abordagem usando Reflection, mas nao não ficaria melhor, mais rapido ou mais pratico usando o Spring ?

Analizando bem essa historia “Don’t repeat the DAO!” parece mais coisa de preguicoso.
O exemplo da Caelum parece o mais pratico de todos… isso se alguem realmente quiser ter essa abordagem de nao repetir os DAOs.

Ronildo, sobre esse comentario do Fabio kung a respeito de heranca, le o ultimo post que fizemos sobre heranca: