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");
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");
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.