Troubleshooting: Evitando NonUniqueObjectException Hibernate

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!!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *