【发布时间】:2013-05-27 19:59:06
【问题描述】:
我正在使用 JPA EntityManager 执行一些操作,其中一个操作是将一个实体替换为另一个具有相同 @Id 的实体。那么,给定oldObject 和newObject,删除oldObject 并将其替换为newObject 的最佳方法是什么?
下面是一些不起作用的代码:
try
{
entityManager.getTransaction().begin();
entityManager.remove(oldObject);
entityManager.persist(newObject);
entityManager.getTransaction().commit();
}
catch (PersistenceException persistExc)
{
entityManager.getTransaction().rollback();
// do some stuff
}
此代码出现以下异常:
javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.depressio.SomeObject
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1215)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1148)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1154)
at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:678)
现在,如果我不删除实体,而只是更新其已更改的字段,那么它当然可以正常工作。但是,我只是得到了新对象(UI 正在通过 REST 向我扔它),所以我真的不知道哪些字段发生了变化,所以我必须更新 every em> 字段。如果有很多字段,那就不太理想了。
我想我对如何正确执行删除有点困惑。我认为EntityManager.remove 是正确的方法,但我想不是。
提前致谢!
编辑 1:我觉得我应该注意 oldObject.id == newObject.id。 id 是通过@SequenceGenerator 生成的。如果对象的标识符已经用生成器注释,我是否可以使用标识符持久化对象?
编辑 2:根据最受好评的答案 here,因为 @Id 已经定义并且它是一个自动生成的字段,Hibernate 认为它是分离的。现在我知道为什么我得到了异常,但解决方案仍然不清楚。
【问题讨论】:
标签: hibernate jpa entitymanager