Olá Pessoal,
O post de hoje é mais um throubleshooting e com o Hibernate novamente. Em algum momento durante o desenvolvimento é possível que você se depare com a exceção NonUniqueObjectException Hibernate. Mas iai, o que fazer?
Lets go…
É muito comum ver essa exceção quando estamos trabalhando com o Hibernate e precisamos, em muitos dos casos, salvar ou atualizar um objeto. Mas nem sempre as coisas acontecem como esperamos ao dar um saveOrUpdate ou update, dai explode a exceção NoUniqueObjectException. O que fazer?
1. Descobrir o motivo da exceção.
2. Buscar a solução ideal.
O conceito de persistência de objetos proíbe a existência de duas instâncias para o mesmo objeto em memória e ao tentar salvarOrUpdate temos a exceção acima. Mas o que significa?
Em poucas palavras, quando o hibernate lança NonUniqueObjectException significa que tentei salvar um objeto que já estava carregado na memória em uma instância diferente.
E como resolver?
A forma correta para solução é fazer um merge(), pois este efetuará a fusão dos objetos e no final a funcionalidade é a mesma do método saveOrUpdate.
Ou
Usar o flush() antes de saveOrUpdate, pois o flush() força a sincronização dos objetos em memória com o banco de dados.
Simples não? Mas pode ter certeza que as chances de você ficar horas e horas tentando arrumar são grandes. Confesso que na primeira vez que tive essa exceção gastei um bom tempo até entender e descobrir o motivo dela e onde que explodia de fato.
Vou ficando por aqui. Espero que tenham gostado do post.
See ya!!