Solucionado (ver solução)

Importante

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!

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.