Olá pessoal, eu gostaria de esclarecer umas dúvidas...
Após o instrutor mostrar o merge e a criação de um novo entitiy manager, tentei atualizar os dados no banco de dados automaticamente igual acontecia nos EMs anteriores (quando foi utilizado find e persist) apenas utilizando o setter e as transações.
Pela maneira que o instrutor disse, o find e persist deixam o nosso objeto no estado managed, e o merge também fazia isso.
Logo, eu havia concluído que bastava fazer algo do tipo novoEM.merge(MeuObjeto)
e depois voltar a fazer as alterações que eu quisesse via setter e transações que tudo ia voltar a funcionar. Como antes.
Mas não foi o caso. Esse comportamento só voltaria a acontecer se eu buscasse o objeto a partir do método find, ou então, eu iria acabar caindo na contradição que o instrutor não queria que caísse: Que o merge é para update.
Existe mesmo essa situação? Mesmo que um objeto seja managed, ele nao está digamos que... Totalmente sincronizado com o Hibernate? (no quesito de suas alterações). De qualquer forma, acredito que o instrutor poderia ter comentado sobre isso, uma vez que ele não quisesse que nós caíssemos no dilema do update.
Vou mostrar os cases aqui: 1) Assim funciona do jeito que eu esperava (utilizando o find)
//Com o em1 fechado, hora de fazer atualizações em 'leonardo' e depois 'mergear';
leonardo = em2.find(Conta.class, 1L);
leonardo.setSaldo(1234.0);
//Tentando alteração
em2.getTransaction().begin();
em2.getTransaction().commit();
em2.close();
2) Assim funciona, mas NÃO do jeito que eu esperava (utilizando o merge como update)
//Com o em1 fechado, hora de fazer atualizações em 'leonardo' e depois 'mergear';
leonardo.setSaldo(55554.0);
em2.merge(leonardo);
//Tentando alteração
em2.getTransaction().begin();
em2.getTransaction().commit();
em2.close();
3) Assim não funciona, porém foi uma possibilidade que eu havia entendido
//Com o em1 fechado, hora de fazer atualizações em 'leonardo' e
// eventualmente salvar as alterações
em2.merge(leonardo);
leonardo.setSaldo(12345.0);
//Tentando alteração
em2.getTransaction().begin();
em2.getTransaction().commit();
em2.close();