| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/11/2007 22:15:49
|
Taz
Virtual Machine Man
Membro desde: 02/06/2005 16:28:38
Mensagens: 505
Offline
|
emerleite wrote:
Concluí então, que utilizando Hibernate não preciso criar RepositorioXXX ou Criterias ou DAOs já que o Hibernate tem tudo isso a disposição através da Session/EntityManager, Criteria, Dialeto do Banco de Dados e a geração automática das instruções SQL.
Acho que não. Os DAOs ainda são válidos, já os Repositorios nem tanto...
emerleite wrote:
Utilizando a Session/EntityManager na Fachada de Serviços ou até mesmo dentro de alguma Entity(DDD) ...
Fica meio estranho acessar o EntityManger de dentro de Entities.
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/11/2007 22:46:22
|
Alessandro Lazarotti
JavaEvangelist
![[Avatar]](/images/avatar/2aaaddf27344ee54058548dc081c6541.jpg)
Membro desde: 21/01/2004 14:12:54
Mensagens: 468
Offline
|
O seu repositório pode cuidar de operações mais complexas do que simplesmente fazer um CRUD ou uma busca simples. Para formar um agregado, por exemplo, você pode realizar mais de uma consulta no banco.
Um repositório é um elemento ativo no negócio e na modelagem, não é uma ferramenta de acesso a dados. Ele pode ser modelado com comportamento (métodos) que fazem sentido quando colocados em um diagrama do domínio, pois o objeto em sí pertence ao domínio. Um EntityManager não pertence a domínio algum, e seus métodos não são Ubiquitous.
O repositório tbm é um bom lugar para você definir seus contratos quando se interage com algo da persistencia (e retornar uma exception para seu cliente da camada). Isso parece melhor do que retornar true/false, null, 1/0, e outras bizarrices.
Colocar EntityManager diretamente nas entidades parece um grande acoplamento entre meios de persistencia e objetos de negócio.
This message was edited 1 time. Last update was at 16/11/2007 22:47:08
|
... Lezinho
------------------------
http://alessandrolazarotti.wordpress.com/
http://jbossbrasil.ning.com/
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/11/2007 14:05:38
|
Emerson Macedo
Virtual Machine Man
![[Avatar]](/images/avatar/360c19682e81f21d55846685c1701179.jpg)
Membro desde: 01/08/2006 16:55:28
Mensagens: 572
Localização: Rio de Janeiro - RJ
Offline
|
@Lezinho
Concordo com você. Então o que eu disse sobre ter no Repository um adicionar que chama o persist() do EntityManager tornando esses métodos do Repository apenas um método que delega a tarefa e era isso que não estava me agradando muito. Mas parece que não tem outro jeito.
Mas de qualquer maneira a idéia do EntityManager não seria implementar um Repository só que genérico ? Eu entendo que fica mais Ubiquitous mas não sei se vale muito a pena abstrair isso em todos os casos. Talvez na maioria dos casos não seja necessário. E isso justamente que eu to me perguntando se tem algum caso que vou precisar realmente ...
Exemplos ?
|
Emerson Macedo Leite
PMP - Ping-pong Master Player
http://codificando.com
"Porque, assim como o relâmpago sai do oriente e se mostra até o ocidente, assim será também a vinda do filho do homem." - Mateus 24:27 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/11/2007 03:11:54
|
rodrigoy
Virtual Machine Man
![[Avatar]](/images/avatar/cf79ae6addba60ad018347359bd144d2.jpg)
Membro desde: 18/04/2006 01:06:28
Mensagens: 634
Localização: São Paulo
Offline
|
Parta do pressuposto que é natural da entidade ela ser "persistente", dessa forma, não é comum que uma entidade "salve" ela própria ou outras entidades dentro do comportamento da própria entidade. Minhas entidades não dependem do EntityManager, mas minhas façades sim...
Dado o paradigma atual uma das grandes responsabilidades da camada de aplicação é concentrar o controle de transação, seja por AOP, Anotações, Contâiner, etc... Assim sendo, é na camada de aplicação que está os manager.persist e manager.merge.
Lembre-se também: só usamos o EntityManager por causa de ORM, e nossas entidades não sabem disso.
|
Rodrigo Yoshima
www.ASPERCOM.com.br
Próximas turmas: Requisitos SP 01/12 | Scrum em Curitiba 10/12 | UML SP 12/01 | Scrum SP 24/01
Débito Técnico Blog: blog.aspercom.com.br
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/11/2007 13:00:46
|
Fabio Kung
JavaEvangelist
Membro desde: 08/03/2004 08:24:47
Mensagens: 425
Localização: São Paulo
Offline
|
Concordo um pouco com o que o Rodrigo disse. Os repositorios trazem bastante valor para agregados e pesquisas complexas. Considerando que você não está usando ActiveRecord, você não vai precisar chamar save/persist/merge dentro dos seus objetos de domínio. Aí o Repositório não precisaria ter o adicionar() que só delega.
Minha opinião pessoal é de que não é tão ruim ter métodos do Repositório que apenas delegam se você não quiser expor a Session/EntityManager. O Repositório nesses casos fica sendo um "Adapter", mas concordo que isso é um pouco burocrático...
De qq forma, Java é burocrático mesmo!
|
http://blog.caelum.com.br
Fabio Kung
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/11/2007 13:30:32
|
Emerson Macedo
Virtual Machine Man
![[Avatar]](/images/avatar/360c19682e81f21d55846685c1701179.jpg)
Membro desde: 01/08/2006 16:55:28
Mensagens: 572
Localização: Rio de Janeiro - RJ
Offline
|
rodrigoy wrote:Parta do pressuposto que é natural da entidade ela ser "persistente", dessa forma, não é comum que uma entidade "salve" ela própria ou outras entidades dentro do comportamento da própria entidade. Minhas entidades não dependem do EntityManager, mas minhas façades sim...
Exatamente isso que eu disse nos posts anteriores. Porém pensando no Repository, em alguns casos temos referência dentro da Entity para um repositório, vide esse exemplo http://blog.caelum.com.br/2007/06/09/repository-seu-modelo-mais-orientado-a-objeto/.
E ai é que eu estava me perguntando se ao invés do Repository poderia ser sempre o EntityManager substituindo-o por completo. Pelo visto o pessoal ta preferindo e indicando encapsular.
Fabio Kung wrote:Minha opinião pessoal é de que não é tão ruim ter métodos do Repositório que apenas delegam se você não quiser expor a Session/EntityManager. O Repositório nesses casos fica sendo um "Adapter", mas concordo que isso é um pouco burocrático...
É o que eu havia dito que eu não gostaria já que na verdade não está me parecendo muito um adapter e tão apenas um delegate bem simples.
Bem, no próximo projeto vou encapsular o EntityManager em cada Repository específico para gerênciar os agreggates e as queries complexas pra ver se terei algum ganho com isso. Claro que um ganho que percebo de cara é ficar mais Ubiquitous mas realmente como o Fábio falou, que burocracia heim ....
|
Emerson Macedo Leite
PMP - Ping-pong Master Player
http://codificando.com
"Porque, assim como o relâmpago sai do oriente e se mostra até o ocidente, assim será também a vinda do filho do homem." - Mateus 24:27 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/11/2007 19:06:37
|
pcalcado
Moderador
![[Avatar]](/images/avatar/110eec23201d80e40d0c4a48954e2ff5.jpg)
Membro desde: 08/03/2004 17:19:35
Mensagens: 5115
Localização: Melbourne - Australia
Offline
|
Essa discussão já foi feita no GUJ algumas vezes mas acho que 99% das suas dúvidas práticas vão se reslver se você modelar o Repositório como uma interface implementada pelo DAO. O Repositório é um conceito de negócios que desta forma vai ser implementado pelo Dependency Inversion Principle (DIP, Uncle Bob).
|
Phillip Calçado "Shoes"
http://fragmental.tw/
http://blog.fragmental.com.br/
"It is unfortunate that much of what is called 'object-oriented programming today is simply old style programming with fancier constructs." - Alan Kay |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/11/2007 23:07:55
|
Alessandro Lazarotti
JavaEvangelist
![[Avatar]](/images/avatar/2aaaddf27344ee54058548dc081c6541.jpg)
Membro desde: 21/01/2004 14:12:54
Mensagens: 468
Offline
|
emerleite wrote:Exemplos ?
Um exemplo mais simples e direto de como pode comprometer seu objeto Entity de negócio inserindo diretamente EntityManager, é na construção de testes unitários.
|
... Lezinho
------------------------
http://alessandrolazarotti.wordpress.com/
http://jbossbrasil.ning.com/
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/11/2007 01:35:13
|
rodrigoy
Virtual Machine Man
![[Avatar]](/images/avatar/cf79ae6addba60ad018347359bd144d2.jpg)
Membro desde: 18/04/2006 01:06:28
Mensagens: 634
Localização: São Paulo
Offline
|
pcalcado wrote:Essa discussão já foi feita no GUJ algumas vezes mas acho que 99% das suas dúvidas práticas vão se reslver se você modelar o Repositório como uma interface implementada pelo DAO. O Repositório é um conceito de negócios que desta forma vai ser implementado pelo Dependency Inversion Principle (DIP, Uncle Bob).
Tanto que nem chamo meus repositories de ContaRepository, chamo eles de ContaDAO mesmo. O que interessa é o conceito.
Um padrão comum nas minhas aplicações é este:
|
| Nome do arquivo |
exemplo_repository.GIF |
Download
|
| Descrição |
|
| Tamanho |
9 Kbytes
|
| Baixado: |
89 vez(es) |
This message was edited 1 time. Last update was at 19/11/2007 01:35:59
|
Rodrigo Yoshima
www.ASPERCOM.com.br
Próximas turmas: Requisitos SP 01/12 | Scrum em Curitiba 10/12 | UML SP 12/01 | Scrum SP 24/01
Débito Técnico Blog: blog.aspercom.com.br
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/11/2007 01:41:05
|
rodrigoy
Virtual Machine Man
![[Avatar]](/images/avatar/cf79ae6addba60ad018347359bd144d2.jpg)
Membro desde: 18/04/2006 01:06:28
Mensagens: 634
Localização: São Paulo
Offline
|
O que não impediria também de fazer isso:
|
| Nome do arquivo |
exemplo_entity_repository.GIF |
Download
|
| Descrição |
|
| Tamanho |
5 Kbytes
|
| Baixado: |
66 vez(es) |
|
Rodrigo Yoshima
www.ASPERCOM.com.br
Próximas turmas: Requisitos SP 01/12 | Scrum em Curitiba 10/12 | UML SP 12/01 | Scrum SP 24/01
Débito Técnico Blog: blog.aspercom.com.br
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/11/2007 08:34:05
|
mauro_schneider
JavaChild
Membro desde: 31/03/2005 07:43:23
Mensagens: 134
Offline
|
rodrigoy wrote:
Tanto que nem chamo meus repositories de ContaRepository, chamo eles de ContaDAO mesmo. O que interessa é o conceito.
Mas será que nome não faz parte do conceito ?
Neste caso ContaDAO (Interface) vai estar nas classes de Dominio ?
No meu modo de ver se ContaDao ser chamada de ContaRepository e esta ser injetada do Dominio, fica mais organizado.
|
http://blog.mauros.org |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/11/2007 09:19:17
|
Emerson Macedo
Virtual Machine Man
![[Avatar]](/images/avatar/360c19682e81f21d55846685c1701179.jpg)
Membro desde: 01/08/2006 16:55:28
Mensagens: 572
Localização: Rio de Janeiro - RJ
Offline
|
pcalcado wrote:Essa discussão já foi feita no GUJ algumas vezes mas acho que 99% das suas dúvidas práticas vão se reslver se você modelar o Repositório como uma interface implementada pelo DAO. O Repositório é um conceito de negócios que desta forma vai ser implementado pelo Dependency Inversion Principle (DIP, Uncle Bob).
Pois é. Pra mim o Repository seria uma interface e não uma classe concreta. Mas o pessoal tava sugerindo como se fosse uma classe concreta. Acho que esse teu exemplo do Repository ser a especificação (contrato/interface, ou como queira) do DAO uma abordagem válida. Mas lembra da tal discussão que teve uma vez no GUJ sobre o Hibernate eliminar a necessidade do DAO, já que o EntityManager/Session faz esse papel de DAO para quase todos os cenários? Mas pelo visto não morre a necessidade que é o que eu achava que ia acontecer ...
A unica coisa que mudou é que minha interface do componente de acesso a dados ficou Ubiquitous e ao invés de escrever os SQL eu uso o Hibernate (Claro, com todas as suas vantagens de lazy-load etc etc etc.)
Acho que viajei na maionese achando que essa estrutura iria mudar .. Me corrijam se eu estiver errado.
rodrigoy wrote:Tanto que nem chamo meus repositories de ContaRepository, chamo eles de ContaDAO mesmo. O que interessa é o conceito.
Não estariamos deixando de expressar um conceito no código ? Acho que seria melhor que seja ContaRepository mesmo.
This message was edited 2 times. Last update was at 19/11/2007 09:30:28
|
Emerson Macedo Leite
PMP - Ping-pong Master Player
http://codificando.com
"Porque, assim como o relâmpago sai do oriente e se mostra até o ocidente, assim será também a vinda do filho do homem." - Mateus 24:27 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/11/2007 09:26:10
|
Emerson Macedo
Virtual Machine Man
![[Avatar]](/images/avatar/360c19682e81f21d55846685c1701179.jpg)
Membro desde: 01/08/2006 16:55:28
Mensagens: 572
Localização: Rio de Janeiro - RJ
Offline
|
Lezinho wrote:
emerleite wrote:Exemplos ?
Um exemplo mais simples e direto de como pode comprometer seu objeto Entity de negócio inserindo diretamente EntityManager, é na construção de testes unitários.
Considerando que EntityManager é uma interface, não vi diferença em coloca-lo no lugar do Repositório para a questão dos testes já que seria possível criar um mock da mesma forma. Não entendi muito bem o seu exemplo.
|
Emerson Macedo Leite
PMP - Ping-pong Master Player
http://codificando.com
"Porque, assim como o relâmpago sai do oriente e se mostra até o ocidente, assim será também a vinda do filho do homem." - Mateus 24:27 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/11/2007 09:36:19
|
BiraBoy
JavaChild
![[Avatar]](/images/avatar/7050094b04fd9aa310d3d5efde279058.jpg)
Membro desde: 26/10/2006 11:52:14
Mensagens: 146
Localização: Natal
Offline
|
Ubiquitous. O que isso quer dizer mesmo?
|
There are only 10 kinds of people in the world: those who understand binary and those who don't. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/11/2007 09:46:26
|
Fabio Kung
JavaEvangelist
Membro desde: 08/03/2004 08:24:47
Mensagens: 425
Localização: São Paulo
Offline
|
mauro_schneider wrote:Mas será que nome não faz parte do conceito ?
http://www.fabiokung.com/2007/11/12/comments-to-gavin-king-about-ddd-and-repositories/
ps.: odeio fazer isso, mas essa não consegui evitar...
mauro_schneider wrote:No meu modo de ver se ContaDao ser chamada de ContaRepository e esta ser injetada do Dominio, fica mais organizado.
Concordo.
|
http://blog.caelum.com.br
Fabio Kung
|
|
|
 |
|
|