Comportamento do entitymanager

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…