Alternativas para o DAO  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
wingb
Thread.start()

Membro desde: 23/10/2011 16:35:15
Mensagens: 25
Localização: Porto Alegre
Offline

Olá pessoal,
Digamos que eu queira fazer um sistema de login com hibernate e não use DAO, com o acesso ao banco e as regras de negócio todas no Entity. Isso acaba perdendo um pouco do sentido já que a Entity é geralmente um POJO não? Qual seria uma boa solução para isso e outros casos evitando o uso de DAO e POJO?
Não sei se fui claro o suficiente, aguardo respostas.
Abraços.
WRYEL
JavaEvangelist
[Avatar]

Membro desde: 03/03/2008 21:27:20
Mensagens: 447
Localização: São Paulo
Offline

você quer programar em java estilo código C ou assembly ?

cara ... isso vai virar uma bagunça hehe, o que eu vejo muito por ai, é a camada de negocio interagindo direto com o entity manager, até porquê, tem muito arquiteto e defensor de design pattern que diz que quando se usa jpa/hibernate, não há necessidade da camada de DAO eu particularmente acho isso meio loucura.

[]'s

/**
* http://www.wryel.com.br
* SCJA / SCJP / OCWCD
*/
[WWW] [MSN]
wingb
Thread.start()

Membro desde: 23/10/2011 16:35:15
Mensagens: 25
Localização: Porto Alegre
Offline

WRYEL wrote:você quer programar em java estilo código C ou assembly ?

cara ... isso vai virar uma bagunça hehe, o que eu vejo muito por ai, é a camada de negocio interagindo direto com o entity manager, até porquê, tem muito arquiteto e defensor de design pattern que diz que quando se usa jpa/hibernate, não há necessidade da camada de DAO eu particularmente acho isso meio loucura.

[]'s


Te entendo, eu tinha pensando em não usar DAO porque a aplicação vai ser simples mas agora vou repensar o caso.
bob_sponja
JavaBaby

Membro desde: 03/05/2011 23:21:06
Mensagens: 88
Offline

Cara, já ouviu falar do padrão Active Record? É o padrão adotado pelo Rails na parte da persistência. Dá uma olhada nele, e é bem parecido com o que você tinha pensado: a própria entity reponsável pelo seu armazenamento. A grosso modo, utilizando hibernate seria mais ou menos assim:


Isso seria um exemplo bem simplório do que seria o padrão Active Record. O lance seria a forma da entidade obter uma referência a uma sessão do Hibernate... Mas dá uma pesquisada aí nesse padrão pra ter uma nova perspectiva...
wingb
Thread.start()

Membro desde: 23/10/2011 16:35:15
Mensagens: 25
Localização: Porto Alegre
Offline

Vou dar uma estudada hoje e aplicar a solução que me parecer mais adequada. Amanhã posto ela e vocês dão as suas opiniões.
Obrigado pela ajuda.
marioareias
Thread.start()

Membro desde: 01/02/2012 11:20:43
Mensagens: 28
Localização: Porto Alegre
Offline

wingb wrote:Vou dar uma estudada hoje e aplicar a solução que me parecer mais adequada. Amanhã posto ela e vocês dão as suas opiniões.
Obrigado pela ajuda.


Estuda bem os conceitos, o que é DAO, o que é entidade e o que é regra de negócio. Não misture regras de negócio com DAOs! São coisas distintas
wingb
Thread.start()

Membro desde: 23/10/2011 16:35:15
Mensagens: 25
Localização: Porto Alegre
Offline

Então pessoal, ainda não cheguei em uma conclusão mas tenho algumas ideias: deixarei as regras de negócio nas entities. Na questão da persistência, a ideia que tive foi utilizar uma combinação de HibernateUtil (ou um DAO genérico) junto com o padrão Repository quando fosse necessário manipular as consultas. Eu só fiquei com uma dúvida, vi um HibernateUtil tendo métodos de consulta ao banco, isso é correto?
wingb
Thread.start()

Membro desde: 23/10/2011 16:35:15
Mensagens: 25
Localização: Porto Alegre
Offline

Pessoal, tive a ideia de não deixar a minha entidade anêmica então deixei as regras de negócio nele. No entanto fiquei na dúvida quanto a persistência e a injeção de dependência e pensei nessa solução:



Agora se lá na camada da GUI eu precisar chamar o repositório para salvar ou atualizar um usuário no banco?
Farei isso?

Eu dei uma lida que alguns frameworks fazem DI mas não cheguei a me aprofundar. O que vocês sugerem?
josernn17
HelloWorld

Membro desde: 04/02/2012 13:21:13
Mensagens: 11
Offline

Qual o motivo, de se fazer dessa forma, já que o padrão Dao, é tão simples?
wingb
Thread.start()

Membro desde: 23/10/2011 16:35:15
Mensagens: 25
Localização: Porto Alegre
Offline

josernn17 wrote:Qual o motivo, de se fazer dessa forma, já que o padrão Dao, é tão simples?


Oi josernn17, o interessante disso é poder envolver buscas ou manipular dados nas entidades. A solução que eu encontrei para chegar nisso foi usando o padrão Repository. As entidades podem depender dele já que o mesmo pertence a camada de negócio.

Sobre o DAO, como foi comentado nesse tópico há uma discussão se devemos ou não utilizá-lo com frameworks ORM. Pessoalmente eu não gosto de DAO, então sempre procurei fugir dele em projetos na qual eu tivesse liberdade para isso, no entanto, é perfeitamente possível utilizar um DAO genérico e o Repository faria as chamadas para ele.
saoj
JWizard
[Avatar]

Membro desde: 09/03/2004 23:34:46
Mensagens: 2667
Localização: Chicago, EUA
Offline

Uma opção mais interessante na minha opinião. Capa o Hibernate e mantem o seu DAO.

Sergio A Oliveira Jr. - saoj

ExperiMENTA:

Mentawai = http://www.mentaframework.org - Full-stack Java Web Framework com Configuracão Programática
MentaQueue = http://mentaqueue.soliveirajr.com - Queue de alta-performance.
MentaLog = http://mentalog.soliveirajr.com - Non-intrusive, fast, garbage-less, colored and straightforward logging
MentaBean = http://mentabean.soliveirajr.com - Tiny ORM with SQL Builder
MentaRegex = http://mentaregex.soliveirajr.com - Perl-style regex for Java.
MentaContainer = http://mentacontainer.soliveirajr.com - Straightforward IoC, DI e Auto-Wiring
Space4J = http://www.space4j.org - Banco-de-dados de Objetos em Memória
Options-Lib = https://github.com/saoj/options-lib - Ruby classes para ter acesso as opcoes do Yahoo Finance
Selleto = http://www.selleto.com.br
Flipinion = http://www.flipinion.com
Kawai = http://www.kawaiwiki.org


[Email] [WWW]
wingb
Thread.start()

Membro desde: 23/10/2011 16:35:15
Mensagens: 25
Localização: Porto Alegre
Offline

saoj wrote:Uma opção mais interessante na minha opinião. Capa o Hibernate e mantem o seu DAO.


É uma opção. Discorra sobre ela.
saoj
JWizard
[Avatar]

Membro desde: 09/03/2004 23:34:46
Mensagens: 2667
Localização: Chicago, EUA
Offline

Tive que olhar no dicionário o que é discorrer: http://www.dicionarioinformal.com.br/discorrer/



Esse tópico fala tudo sobre isso: http://www.guj.com.br/java/252013-voce-nao-gosta-do-hibernate-eu-tb-nao-leia-para-entender-o-porque

Simplificando: se vc sabe SQL é preferível utilizar um sql-builder / jdbc-helper com DAO e deixar de fora o hibernate que é uma complexidade maior (hibernate e todas as suas sacanagens, mágicas, suposições, HQL, Criteria, annotations, etc.) para simplificar uma complexidade menor (jdbc + sql) com ganhos bastante duvidosos.

Na minha humilde opinião abstração só cabe quando há simplificações claras. Hibernate resolve um problema (jdbc + sql) criando outro maior (veja a quantidade de dúvidas no GUJ sobre o Hibernate), logo isso não pode ser chamado de abstração.

Opções: MentaBean (http://mentabean.soliveirajr.com), iBatis, jOOQ, etc.

Eu acredito que essas opcões acima resolvem o problema jdbc de uma forma muito mais simples e menos intrusiva. Agora tem que saber SQL, que é a linguagem nativa dos banco-de-dados. Aprender HQL / Criteria sem saber SQL fica esquisito e com certeza vai te pegar lá na frente.

This message was edited 4 times. Last update was at 05/02/2012 19:22:48


Sergio A Oliveira Jr. - saoj

ExperiMENTA:

Mentawai = http://www.mentaframework.org - Full-stack Java Web Framework com Configuracão Programática
MentaQueue = http://mentaqueue.soliveirajr.com - Queue de alta-performance.
MentaLog = http://mentalog.soliveirajr.com - Non-intrusive, fast, garbage-less, colored and straightforward logging
MentaBean = http://mentabean.soliveirajr.com - Tiny ORM with SQL Builder
MentaRegex = http://mentaregex.soliveirajr.com - Perl-style regex for Java.
MentaContainer = http://mentacontainer.soliveirajr.com - Straightforward IoC, DI e Auto-Wiring
Space4J = http://www.space4j.org - Banco-de-dados de Objetos em Memória
Options-Lib = https://github.com/saoj/options-lib - Ruby classes para ter acesso as opcoes do Yahoo Finance
Selleto = http://www.selleto.com.br
Flipinion = http://www.flipinion.com
Kawai = http://www.kawaiwiki.org


[Email] [WWW]
wingb
Thread.start()

Membro desde: 23/10/2011 16:35:15
Mensagens: 25
Localização: Porto Alegre
Offline

Olá saoj, vou estudar o seu framework e compará-lo com Hibernate nos próximos dias e ai decido o que usarei. Se eu tiver alguma dúvida ou colocação posto no tópico. Obrigado pela ajuda.
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline



Ufa... pensei que eu era o único.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team