Pessoal,
Estou com um problema, que na verdade deve ser meu mal entendimento com relação ao entitymanager.
Tenho uma classe X que possui um relacionamento com Y e Y tem relacionamento com Z.
Quando entro em minha tela jsf (para alteração), eu carrego a entidade X e automaticamente ja carrega Y e Z… Em minha tela tenho duas combos que mudam diretamente as entidades Y e Z da entidade X.
O problema ocorre quando tento cancelar todas as alteracoes da minha tela, ou seja, fazer um undo.
Estou executando,
X = em.merge(X);
em.refresh(X);
com o objetivo de trazer o que esta no BD e sobrescrever minha entidade… aparentemente funciona, ou seja, a entidade X fica com os valores originais do BD… porem, quando volto para minha tela de pesquisa e executo uma pesquisa, é gerado a query sql e tbm alguns inserts e updates… Ou seja, por algum motivo, a entidade X fica marcada para ser alterada no BD, mesmo que eu tenha feito o refresh e merge acima…
Obrigado…
Leia esse post: JPA: Mini Livro - Primeiros passos e conceitos detalhados.
Você precisa entender o conceito de EAGER/LAZY e Cascade.
ola Hebert, muito legal sua resposta e seus posts… realmente me deram uma luz sobre algumas coisa…
porém, ainda me ficou uma duvida… o método merge qdo executado, vai marcar minha entidade para em momento oportuno, fazer um update no bd ??
pelo que eu entendi o refresh pegaria os dados do BD o sobrescreveria os dados da minha entidade… porem, qdo tento fazer isso, recebo um erro de que minha entidade nao esta “managed”… ai eu faço o merge e depois tento dar o refresh… mas depois de feito o merge, nao sei por que cargas dagua, ele faz o update das informacoes…
seria o caso de fazer um find(entidade.id) para poder fazer esse undo???
obrigado…
Tem algo errado. 1 que ao fazer merge, pq o refresh? Com o merge seu banco vai ser igual aos dados que estão presentes no objeto.
Se você faz merge e refresh seguidos mas tem mensagem de detached, tem algum relacionamento detached que está recebendo cascade.
[quote=bobsiqueira]ola Hebert, muito legal sua resposta e seus posts… realmente me deram uma luz sobre algumas coisa…
porém, ainda me ficou uma duvida… o método merge qdo executado, vai marcar minha entidade para em momento oportuno, fazer um update no bd ??
pelo que eu entendi o refresh pegaria os dados do BD o sobrescreveria os dados da minha entidade… porem, qdo tento fazer isso, recebo um erro de que minha entidade nao esta “managed”… ai eu faço o merge e depois tento dar o refresh… mas depois de feito o merge, nao sei por que cargas dagua, ele faz o update das informacoes…
seria o caso de fazer um find(entidade.id) para poder fazer esse undo???
obrigado…[/quote]
Sim, nesse caso parece mais correto fazer um find.
Se você utilizar o merge ele fará sim o update das alterações.
Hebert,
Se eu faço:
em.refresh(X);
aí sim recebo um detached.
por isso eu primeiro devo fazer
para a entidade tornar-se detached e depois um refresh para obter as atualizacoes do BD.
[quote=bobsiqueira]Hebert,
Se eu faço:
em.refresh(X);
aí sim recebo um detached.
por isso eu primeiro devo fazer
para a entidade tornar-se detached e depois um refresh para obter as atualizacoes do BD.
[/quote]Leia o post que eu passei, a parte sobre cascade.
Hebert,
Não acredito que o problema seja o cascade, pois, eu nao coloquei cascade em nenhuma dessas entidades…
tentei usar o find para sobrescrever a entidade, mas ele acaba pegando a entidade do contexto ao invés de buscar no BD… mto estranho…