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");
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
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.