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

Merge no remove

Só para confirmar uma dúvida: na CategoriaDAO, o método "atualizar" não precisa reatribuir o objeto com o merge, pois o intuito é já passar como parâmetro a categoria atualizada e o merge vai devolver um outro objeto atualizado para o commit.

Já no método de remover, vamos reatribuir, pois precisamos que aquele objeto no parâmetro em específico seja o mergeado, para removê-lo depois, correto?

Já aproveitando, no método de atualizar (quando não reatribuímos), qual é a trajetória desse objeto mergeado? Para onde ele vai por trás dos panos? Não temos mais acesso a ele, certo? E já que ele devolve esse outro objeto atualizado, o que acontece também com o objeto não mergeado? Entendo que vão existir dois objetos na memória nessa situação, um retornado mergeado e outro não mergeado que ficou ali, "vagando", rs.

2 respostas
solução!

Oi Giovani,

Isso mesmo, serão duas referências a 2 objetos distintos na memória. O objeto passado como parâmetro para o método merge se não for reatribuido pode continuar existindo na memória, caso existam outra referências que apontem para ele.

Exemplo:

//entidade cliente de id=1 está no estado managed, pois acabou de ser carregada do banco de dados via metodo find:
Cliente c1 = em.find(1L, Cliente.class);

//agora a entidade passou para o estado detached:
em.clear();

//atributo da entidade foi modificado, mas o update nao sera realizado no banco, pois ela esta no estado detached:
c1.setNome("Nome alterado");

//foi criada uma nova referencia c2 que aponta para o objeto retornado pelo metedo merge e que esta no estado managed. Porem, a referencia c1 ainda aponta para o objeto no estado detached
Cliente c2 = em.merge(c1);

//atributo da entidade foi alterado, porem na referencia c1 que aponta para a versao detached, ou seja, essa alteracao NAO sera enviada para o banco
c1.setNome("nome alterado 2");

//atributo da entidade foi alterado na referencia c2 que aponta para a versao managed, ou seja, essa alteracao sera enviada para o banco
c2.setNome("nome alterado 3");

No exemplo anterior vão ter dois objetos na memória e os dois estão "ativos", pois tem referência apontando para eles.

Bons estudos!

Valeu, Rodrigo, ótima explicação!