| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/11/2006 11:39:31
|
chicocx
JavaChild
![[Avatar]](/images/avatar/5a29503a4909fcade36b1823e7cebcf5.jpg)
Membro desde: 20/03/2005 11:57:35
Mensagens: 131
Localização: Goiânia
Offline
|
Tenho um projeto com as camadas:
Visao -> controle -> negocio -> persistencia -> banco
e um pojo trafegando entre elas.
Onde devo gerenciar a transação (tx.begin() e tx.commit):
no controle, no negocio ou na persistencia ?
Acredito que seja na camada de negocio mas o pessoal aqui na empresa insiste que deve ser no controle...
|
...a arte da via é fazer da vida uma obra de arte...
Ambient Informática
Siga-me no Twitter: @chicocx
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/11/2006 11:47:22
|
luis.soares
JavaEvangelist
![[Avatar]](/images/avatar/4b880d619bbbcbbea22b13bfa30a1ace.png)
Membro desde: 01/08/2006 09:48:47
Mensagens: 310
Localização: São Paulo
Offline
|
Também concordo que deva ser na sua camada de negócios.
|
Luis Soares
Analista Desenvolvedor Java
luishsoares@gmail.com
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/11/2006 11:56:44
|
Thiago Senna
GUJ Master
![[Avatar]](/images/avatar/78719f11fa2df9917de3110133506521.jpg)
Membro desde: 11/02/2005 08:08:02
Mensagens: 1595
Offline
|
Acho que isso varia de sistema em sistema, dependendo de sua arquitetura. Se a sua aplicação tem uma fachada para isolar a camada de negócio do controle, acho que o controle da transação deve ficar na fachada.
Há casos onde o próprio controle (servlet por exemplo) tem acesso direto aos DAO's para persistir os objetos. Nestes casos, em minha opinião, o controle da transação fica no controle. Você poderia por exemplo criar um filtro para ajudá-lo.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/11/2006 12:10:20
|
chicocx
JavaChild
![[Avatar]](/images/avatar/5a29503a4909fcade36b1823e7cebcf5.jpg)
Membro desde: 20/03/2005 11:57:35
Mensagens: 131
Localização: Goiânia
Offline
|
Thiago Senna wrote:Acho que isso varia de sistema em sistema, dependendo de sua arquitetura. Se a sua aplicação tem uma fachada para isolar a camada de negócio do controle, acho que o controle da transação deve ficar na fachada.
Há casos onde o próprio controle (servlet por exemplo) tem acesso direto aos DAO's para persistir os objetos. Nestes casos, em minha opinião, o controle da transação fica no controle. Você poderia por exemplo criar um filtro para ajudá-lo.
Acredito ter sido BEM CLARO em relação ao problema. O que você disse acima já sabemos!
A dúvida é sobre a arquitetura descrita na primeira mensagem.
|
...a arte da via é fazer da vida uma obra de arte...
Ambient Informática
Siga-me no Twitter: @chicocx
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/11/2006 12:11:05
|
chicocx
JavaChild
![[Avatar]](/images/avatar/5a29503a4909fcade36b1823e7cebcf5.jpg)
Membro desde: 20/03/2005 11:57:35
Mensagens: 131
Localização: Goiânia
Offline
|
luis.soares wrote:Também concordo que deva ser na sua camada de negócios.
Obrigado luiz pela sua opinião.
|
...a arte da via é fazer da vida uma obra de arte...
Ambient Informática
Siga-me no Twitter: @chicocx
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/11/2006 12:22:11
|
foliveira81
JavaGuru
Membro desde: 10/09/2006 21:57:52
Mensagens: 204
Offline
|
Amigo acho que a transação deve estar na regra de negocio, imagine q vc tem uma regra que faz o seguinte grava um pedido depois os itens, vc vai usar o dao de pedido e dao de itens, entao vc abre a transacao e executa os dois daos, caso 1 de errado ele desconsidera toda transações..
bom nao sou o dono da verdade..
[]'s
|
Fernando Oliveira |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/11/2006 13:34:38
|
Thiago Senna
GUJ Master
![[Avatar]](/images/avatar/78719f11fa2df9917de3110133506521.jpg)
Membro desde: 11/02/2005 08:08:02
Mensagens: 1595
Offline
|
chicocx wrote:Acredito ter sido BEM CLARO em relação ao problema. O que você disse acima já sabemos!
A dúvida é sobre a arquitetura descrita na primeira mensagem.
Existem visões diferentes sobre camada de 'negócio'. Você poderia muito bem ter uma camada de negócio sem uma fachada.
Um exemplo seria dentro do seu próprio controle você chamar o método funcionario.save(), ou seu controle chamar fachada.salvarFuncionario(funcionario).
Você pode ter achado que foi bem claro, mas posso entender camada de negócio de várias maneiras, ou seja, IMHO, você não foi tão claro.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/11/2006 15:50:57
|
rodrigoy
GUJ Ranger
![[Avatar]](/images/avatar/cf79ae6addba60ad018347359bd144d2.jpg)
Membro desde: 18/04/2006 01:06:28
Mensagens: 758
Localização: São Paulo
Offline
|
Se o seu sistema roda todo em uma única máquina virtual, a melhor solução é colocar o controle transacional na camada de apresentação usando um "pattern" chamado "Open Session in View".
http://www.hibernate.org/43.html
Tem uma implementação exemplo disso usando Struts no nosso site da Hotmotors (veja a implementação de HibernateRequestProcessor.java):
http://www.aspercom.com.br/hotmotors
Objetos de negócio são cegos com relação à transação.
|
Rodrigo Yoshima
www.ASPERCOM.com.br
Próximas Turmas:
São Paulo: Scrum 28/agosto | OOAD-UML 13/setembro
Débito Técnico Blog: blog.aspercom.com.br
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/11/2006 18:42:51
|
Diogo Cabral
Thread.start()
![[Avatar]](/images/avatar/82077c274c8b1917a195adc43f641529.png)
Membro desde: 22/06/2006 12:05:33
Mensagens: 44
Localização: Maceió - AL
Offline
|
Eu costumo utilizar interceptors para tratar as transações.
|
diogocabral.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/12/2006 18:14:07
|
alberto_ribeiro
JavaEvangelist
![[Avatar]](/images/avatar/b36ed8a07e3cd80ee37138524690eca1.jpg)
Membro desde: 01/07/2005 11:15:19
Mensagens: 351
Localização: SP
Offline
|
Trabalho a pouco tempo com Java, porém, um projeto que eu participei tinha algo bem parecido com isso....
Nós desenvolvedores decidimos colocar na camada de negocio, por que se a gente colocasse as transações na camada de persistencia ia ser complicado, imagina você querendo salvar uma compra, você teria que abrir uma transação pra salvar a compra e se você precisa-se de chamar outro dao para salvar um pedido ia ser complicado, então colocando na camada de negócio um nível acima nós podemos abrir uma unica transação e persistir os dois de uma vez só, se por um acaso acontece-se um erro ele iria dar um rolback em tudo...
não sei se estou muito correto mas...
se estiver errado me corrija é bom pra trocar experiência...
[]'s
|
Sun Certified Programmer for Java 1.5 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/12/2006 22:26:21
|
brunohansen
JavaEvangelist
![[Avatar]](/images/avatar/1e0feeaff84a19bf3936e693311fa66d.jpg)
Membro desde: 27/03/2006 11:11:34
Mensagens: 391
Offline
|
chicocx wrote:Tenho um projeto com as camadas:
Visao -> controle -> negocio -> persistencia -> banco
e um pojo de trafegando entre elas.
Onde devo gerenciar a transação (tx.begin() e tx.commit):
no controle, no negocio ou na persistencia ?
Acredito que seja na camada de negocio mas o pessoal aqui na empresa insiste que deve ser no controle...
Acho que um problema pode estar aqui tambem " e um pojo de trafegando entre elas", não seria esse o mochileiro das galaxias do shoes?
Não achei uma referncia sobre ele no fragmental mas sei que tem no Artigo sobre Arquitetura de Camadas em Java EE publicado pela revista Mundo Java em Janeiro de 2006 (edição 15).
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/12/2006 22:40:28
|
brunohansen
JavaEvangelist
![[Avatar]](/images/avatar/1e0feeaff84a19bf3936e693311fa66d.jpg)
Membro desde: 27/03/2006 11:11:34
Mensagens: 391
Offline
|
rodrigoy wrote:Se o seu sistema roda todo em uma única máquina virtual, a melhor solução é colocar o controle transacional na camada de apresentação usando um "pattern" chamado "Open Session in View".
http://www.hibernate.org/43.html
Tem uma implementação exemplo disso usando Struts no nosso site da Hotmotors (veja a implementação de HibernateRequestProcessor.java):
http://www.aspercom.com.br/hotmotors
Objetos de negócio são cegos com relação à transação.
Na camada de apresentação mas no controle(MVC) né? Pois eu acho que eu posso trocar minha visão(MVC) sem afetar o controle de transação que esta no controle(MVC)
Rodrigo só uma dúvida! Controlar transações não seria o trabalho de uma "Unidade de Trabralho (Fowler)"?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/12/2006 00:21:04
|
rodrigoy
GUJ Ranger
![[Avatar]](/images/avatar/cf79ae6addba60ad018347359bd144d2.jpg)
Membro desde: 18/04/2006 01:06:28
Mensagens: 758
Localização: São Paulo
Offline
|
brunohansen wrote:Na camada de apresentação mas no controle(MVC) né? Pois eu acho que eu posso trocar minha visão(MVC) sem afetar o controle de transação que esta no controle(MVC)
Rodrigo só uma dúvida! Controlar transações não seria o trabalho de uma "Unidade de Trabralho (Fowler)"?
Por incrível que pareça, o Open Session in View é na View mesmo, no V. Pensando num ambiente WEB, a cada requisição a transação é aberta logo que a requisição inicia e é fechada quando a requisição é renderizada no cliente. Tudo que ocorre dentro desse período é uma unit of work.
Não é difícil fazer isso usando o RequestProcessor do Struts ou a sugestão de usar filtros que o Diogo sugeriu... é a maneira mais simples de fazer num ambiente web, agora se é um cliente desconectado (como aplicação Swing) aí é diferente...
|
Rodrigo Yoshima
www.ASPERCOM.com.br
Próximas Turmas:
São Paulo: Scrum 28/agosto | OOAD-UML 13/setembro
Débito Técnico Blog: blog.aspercom.com.br
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/12/2006 07:41:39
|
Guerr@
JavaEvangelist
![[Avatar]](/images/avatar/9fb640ea6abe0e849c8c1fd6eea97c22.jpg)
Membro desde: 03/12/2006 10:32:50
Mensagens: 491
Online
|
Se você quiser ser purista, o correto seria as transações serem gerenciadas na camada de negócio. Porém trabalhar com a View em Open Session pode ser uma alternativa interessante se você trabalha com o Lazy Loading do Hibernate, visto que isto, em alguns casos, pode te trazer um bom ganho de desempenho. Se não for o caso, a camada de negócios seria, na minha opinião, a escolha mais acertada.
|
Eduardo Guerra - "É Java na ponta do dedo!"
Desenvolvedor de Frameworks - Pesquisador
Editor Chefe - Revista MundoJ
Professor - Instituto Tecnológico de Aeronáutica
Me siga no Twiter!!! http://twitter.com/emguerra |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/12/2006 09:43:53
|
Fabio Kung
JavaEvangelist
Membro desde: 08/03/2004 08:24:47
Mensagens: 445
Localização: São Paulo
Offline
|
eu diria que o open-session-in-view não está aplicado a nenhuma das camadas MVC, justamente porque engloba todas elas.
Também diria que é a melhor alternativa para o seu caso, pois a responsabilidade de controle transacional está centralizada e os seus objetos de domínio não precisam mais ser responsáveis pelo controle de transações. Código repetido (copy & paste) pelo sistema todo nunca é saudável...
Controlando as transações com filtros/interceptors simplifica bastante, mas existe a restrição de apenas um transação por requisição. O que não é exatamente um problema, porque a grande maioria das aplicações na web só precisam de uma transação por requisição mesmo.
Resolvendo o caso comum (99%) de uma maneira simples, você pode tratar diferente os casos específicos (1%).
Claro que não tenho base científica nenhuma para essas estatísticas: experiência e _feeling_ .
|
Procurando por oportunidades de emprego?
OndeTrabalhar.com
OndeTrabalhar.com Java?
http://blog.caelum.com.br
Fabio Kung
|
|
|
 |
|
|