Exception – org.hibernate.PersistentObjectException: detached entity passed to persist

Monday, 1. August 2011

Ao usar meu entityManager para persistir alguma entidade, o Hibernate lançava a seguinte exceção:
org.hibernate.PersistentObjectException: detached entity passed to persist: bla bla bla bla bla

Pesquisando nas internets descobri que essa exceção é lançada pelo Hibernate quando você está trabalhando em uma entidade que ele ACHA que não está persistida no banco de dados. Ou que ao menos, se está no banco, não foi ele quem gravou.

O fato é que isso só acontecia quando eu mandava persistir uma entidade em que eu gostaria de efetuar um “UPDATE”.

Como todas as minhas classes de entidade extendem de AppEntity, foi só ajustar meu método genérico pra ficar como o abaixo:

@PersistenceContext
EntityManager entityManager;

public T persist(T entidade) {
   if(((AppEntity)entidade).getId()!=null){
      getEntityManager().merge(entidade);
   }else{
      getEntityManager().persist(entidade);
   }
   return entidade;
}

Simples, quando for uma nova entidade use o persist(entidade), quando for update use o merge(entidade).