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

Duvida no Clear();

Não estou conseguindo enxergar o pq do retorno ser "Teste 2", após o uso do clear() o produto não deveria ter passado para DETACHED, fazendo com que a única sincronização com o BD fosse o primeiro flush() do "Teste 1".

Em resumo pq o set do produto 2 funcionou após o clear e o teste 3 (que ao meu ver era o esperado) não.

Estou usando o PostgreSQL

Produto produto = em.find(Produto.class, 1);
        produto.setDescricao("Teste 1");
        em.flush();
        em.clear();
        produto.setDescricao("Teste 2");
        em.merge(produto);
        produto.setDescricao("Teste 3");
        em.getTransaction().commit();
        em.close();
2 respostas
solução!

Oi Luccas,

Após o clear() você alterou a descrição do produto para Teste 2 e na sequencia chamou o merge, fazendo com a JPA mescle esse novo estado na entidade produto.

Mas como você não guardou o retorno do método merge na variável produto, a descrição Teste 3 será ignorada, indo para o banco de dados então como Teste 2.

Na realidade o método merge não serve apenas para voltar uma entidade do estado Detached para Managed, pois ele também vai aplicar todas as mudanças realizadas nos atributos dela para serem sincronizadas no próximo commit/flush.

Bons estudos!

Compreendi, obrigado pela esclarecimento professor.