2
respostas

Retorno do merge

Produto não precisaria receber o retorno do merge para ser que o resultado fosse "Teste 3"?

em.flush();
produto.setDescricao(“Teste 2”);
em.merge(produto);  //Aqui
produto.setDescricao(“Teste 3”);
em.getTransaction().commit();
em.close();

Pq produto já tinha mudado para "detached", o merge não joga a entidade de volta para "managed", mas cria uma cópia dela em estado "managed", logo da forma como o código está ele até faria o select, mas na hora de gravar não seria feito o update no banco, pq a entidade alterada era a que estava "detached" e a descrição do prouto seria "Teste 1". Ai o código ficaria assim

...
produto = em.merge(produto);
produto.setDescricao(“Teste 3”);
em.getTransaction().commit();
em.close();
2 respostas

Olá Leonardo, tudo bem com você?

Com exceção desse trecho: "Pq produto já tinha mudado para detached", a sua explicação do método merge() está correta. O método realmente faz tudo isso que você mencionou, porém ele não muda uma entidade para o estado detached. Perceba que desde o começo - mais especificamente, desde que usamos o método find() - o produto sempre esteve no estado managed:

em.getTransaction().begin();
Produto produto = em.find(Produto.class, 1l); // produto no estado managed
produto.setDescricao(“Teste 1”); // produto alterado aguardando commit() ou flush() para ser atualizado
em.flush(); // produto atualizado/sincronizado com a sua tabela no banco
produto.setDescricao(“Teste 2”); // produto alterado e novamente aguardando ser atualizado
em.merge(produto); // produto já está no estado managed, logo nada acontece - seu retorno é perdido por não ter sido armazenado
produto.setDescricao(“Teste 3”); // produto alterado e ainda no estado managed
em.getTransaction().commit(); // finalizando a transação e sincronizando tudo
em.close();

Perceba que o ponto principal é que nunca tiramos o produto do estado managed e mesmo que o método merge() tenha retornado uma cópia do produto também no estado managed, nada foi alterado no produto original.

Espero ter feito sentido. Mas se ficou alguma dúvida é só avisar! ;)

Forte abraço e bons estudos!!

Entendi, n percebi q não tinha sido dado nenhum clear ou close, logo, ela n mudou de estado. Thiago, muito obrigado.