Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Duvida sobre merge()

Boa tarde. Porque quando se põe o merge antes do set não funciona e o oposto funciona?

funciona

conta.setTitular("Leonardo");
em2.merge(conta);

NÃO funciona

em2.merge(conta);
conta.setTitular("Leonardo");
3 respostas
solução!

Fala ai Pedro, de boa ?

O primeiro caso, você já manipulou todo seu objeto e em seguida passou-o para o entity manager voltar a gerencia-lo, nisso ele entende que ocorreu a mudança e aplica na base.

Já no segundo caso, o entity manager passa a gerenciar o objeto, toda vez que você faz um merge, ele devolve uma instancia que está gerenciada, já a conta que você mandou fazer o merge para ele não significa mais nada.

Ahhh saquei!! obrigadao!!

conta.setTitular("Leonardo");
em2.merge(conta);

O objeto referenciado por "conta" se encontra no estado DETACHED , e com a chamada do merge todo seu "estado " até este ponto será sincronizado com sua representação no BD.

em2.merge(conta);
conta.setTitular("Leonardo");

Para continuar alterando o objeto , você deve fazer como a seguir:

conta = em2.merge(conta);
conta.setTitular("Leonardo");

O merge retorna uma referência para um objeto sincronizado (MANAGED) , então toda alteração realizada neste objeto será sincronizado ao commit da transação.