| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/01/2010 09:42:19
|
rafaelmeireles
JavaTeenager
Membro desde: 13/01/2004 16:12:22
Mensagens: 151
Offline
|
Pessoal, estou utilizando JPA com Hibernate, gostaria de saber se tem como
dizer para a JPA que alterações em uma entidade gerenciada só seja enviada
ao banco quando o método de atualização for chamado?
This message was edited 1 time. Last update was at 26/01/2010 19:57:30
|
Rafael Meireles |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/01/2010 10:11:10
|
vinicius.martinez
JavaBaby
Membro desde: 03/07/2009 14:31:42
Mensagens: 95
Offline
|
Procure pelas funções de callback:
http://ericogr.wordpress.com/2008/04/28/usando-callback-listeners-jpa/
|
KISS - Keep It SIMPLE, STUPID! |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/01/2010 10:22:25
|
rafaelmeireles
JavaTeenager
Membro desde: 13/01/2004 16:12:22
Mensagens: 151
Offline
|
Na verdade não é isso que preciso, o problema aqui é o seguinte
tenho uma entidade gerenciada, em uma tela de edicao, quando o usuario
faz algumas alterações e resolve cancelar como a entidade esta gerenciada
as alterações ja foram para o banco, eu gostaria de saber se tem uma forma de dizer
ao hibernate para ele não atualizar até o metodo merge ser chamado, pois desta forma
se o botao de salvar nao forma chamada as alterações feitas não seram levadas para o banco.
|
Rafael Meireles |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/01/2010 10:35:05
|
vinicius.martinez
JavaBaby
Membro desde: 03/07/2009 14:31:42
Mensagens: 95
Offline
|
seta o "autoCommit" como false e tenha o controle delas.
Só presta atenção, porque agora toda transação para ser efetivada (gravada no banco), voce precisará obrigatoriamente fazer um "commit".
|
KISS - Keep It SIMPLE, STUPID! |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/01/2010 10:41:57
|
rafaelmeireles
JavaTeenager
Membro desde: 13/01/2004 16:12:22
Mensagens: 151
Offline
|
e é exatamento isso que não quero fazer, até pq aqui usamos container EJB e não fazemos commit
|
Rafael Meireles |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/01/2010 11:47:11
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline
|
rafaelmeireles wrote:e é exatamento isso que não quero fazer, até pq aqui usamos container EJB e não fazemos commit
Se vc usa um EJB container, ele faz commit por você. Não tem essa dos dados entrarem sozinho para o banco.
O que vc está falando não faz sentido. Se vc usa JPA sem EJB container, é uma coisa. Se vc usa com, é outra.
A menos que vc esteja usando JPA na sua camada web e fazendos o commit lá. E isso é errado por design.
Explique melhor.
|
Criando sua própria API de Validação
Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/01/2010 12:20:25
|
rafaelmeireles
JavaTeenager
Membro desde: 13/01/2004 16:12:22
Mensagens: 151
Offline
|
é acho q vc não entendeu mesmo não.
Como utilizo o container a entidade fica gerenciada, com a entidade gerenciada qualquer alteração nela
o entityManager ja reflete no banco, isso a propria especificação diz que na hora q o gerenciador bem entender
as alterações vão para o banco, o que eu preciso é trabalhar com a entidade gerenciada mais evitar que as alterações
vão para o banco até que eu chame o merge.
|
Rafael Meireles |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/01/2010 12:44:37
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline
|
rafaelmeireles wrote:é acho q vc não entendeu mesmo não.
Como utilizo o container a entidade fica gerenciada, com a entidade gerenciada qualquer alteração nela
o entityManager ja reflete no banco, isso a propria especificação diz que na hora q o gerenciador bem entender
as alterações vão para o banco, o que eu preciso é trabalhar com a entidade gerenciada mais evitar que as alterações
vão para o banco até que eu chame o merge.
Vc não está interpretando corretamente a especificação. A espeficicação fala isso, mas depois que o commit acontece.
Ou seja, vc dar commit não fignifica que o manager vai gravar naquele momento, mas para a sua aplicação vai.
Alterar um campo na entidade não altera automáticamente no banco. Isso seria absurdo, inutil e estúpido.
Primeiro vc pega o objeto. Vc dá um set alguma coisa. ai vc dá merge/save. e depois vc comita. se vc não der o merge/save nada acontece. se vc não comitar nada acontece. quando o usuário dá cancel, vc simplesmente não dá o merge/save.
|
Criando sua própria API de Validação
Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/01/2010 14:04:18
|
rafaelmeireles
JavaTeenager
Membro desde: 13/01/2004 16:12:22
Mensagens: 151
Offline
|
Cara, aqui utilizamos container EJB, logo não é preciso realizar commit o container ja faz isso.
Quando vc utiliza container, basta pegar a entidade e chamar um metodo set dela, ou entao
se vc tiver uma tela que usa essa entidade e fizer alguma requisição ajax nesse campo, como
a entidade esta gerenciada, quando a requisição termina a alteração ja é refletida no banco.
|
Rafael Meireles |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/01/2010 16:03:02
|
vinicius.martinez
JavaBaby
Membro desde: 03/07/2009 14:31:42
Mensagens: 95
Offline
|
Olha cara..euy não estou entendo muito bem a sua necessidade.
De qualquer forma, acho que isso pode te ajudar:
http://docs.sun.com/source/816-6101-10/ptrans.htm
https://disciplinas.dcc.ufba.br/pub/MAT167SD/TutTransactions/Transactions.pdf
This message was edited 1 time. Last update was at 26/01/2010 16:03:32
|
KISS - Keep It SIMPLE, STUPID! |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/01/2010 17:33:06
|
rafaelmeireles
JavaTeenager
Membro desde: 13/01/2004 16:12:22
Mensagens: 151
Offline
|
pra ficar no historico, colocando flush-mode="manual"
que funciona somento se o hibernate for o provider
ele diz que alterações na entidade mesmo quando esta
for gerenciada, as alterações só seram realizadas se um flush
for feito.
|
Rafael Meireles |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/01/2010 17:45:22
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline
|
rafaelmeireles wrote:Cara, aqui utilizamos container EJB, logo não é preciso realizar commit o container ja faz isso.
Vc não precisa dar o commit, mas precisa dar o merge/save!
simplesmente fazendo o set não altera em nada o estado do sistema.
Basta não fazer o merge/save e os dados , mesmo depois de setados via set, não serão atualizados no banco.
|
Criando sua própria API de Validação
Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/01/2010 18:25:54
|
ovelha
Java Ninja
![[Avatar]](/images/avatar/394201ad68984c677be221f6d9f263fc.jpeg)
Membro desde: 12/09/2007 13:17:41
Mensagens: 281
Offline
|
Se vc alterar a propriedade de um objeto e chamar o flush do EntityManager, será realizado o update sem necessidade de chamar o merge.
É isso que vc quer?
|
bééééééééééééééééé |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/01/2010 19:56:10
|
rafaelmeireles
JavaTeenager
Membro desde: 13/01/2004 16:12:22
Mensagens: 151
Offline
|
Vc não precisa dar o commit, mas precisa dar o merge/save!
simplesmente fazendo o set não altera em nada o estado do sistema.
Basta não fazer o merge/save e os dados , mesmo depois de setados via set, não serão atualizados no banco.
Kra o merge pega as alterações de uma entidade e leva para o banco e retorna
uma entidade gerenciada, a minha entidade JÁ esta gerenciada, logo não preciso de merge
para que suas alterações sejam levadas para o banco, elas seram levadas quando o entity manager bem entender
assim como diz a especificação. Agora se vc usa JPA e altera uma entidade gerenciada e ainda assim
precisa fazer merge, vc deve ta fazendo alguma coisa de errado até pq o conceito de estar gerenciada é esse.
Mais de qualquer forma ja resolvi o problema o flush-mode="manual" indica ao hibernate que mesmo para uma entidade gerenciada
ele so faça as alterações quando o método flush() for chamado manualmente.
Recomendo essa leitura aqui: http://docs.jboss.org/seam/2.1.0.CR1/reference/en-US/html/persistence.html#d0e6811
ela explica com detalhes como utilizar o flush-mode="manual" e foi ela que ajudou a resolver meu problema.
|
Rafael Meireles |
|
|
 |
|
|