我正在使用 JPA EntityManager 执行一些操作,其中一个操作是用另一个具有相同@Id
. 那么,给定 anoldObject
和 a 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 向我扔它),所以我真的不知道哪些字段发生了变化,所以我必须更新每个字段。如果有很多字段,那就不太理想了。
我想我对如何正确执行删除有点困惑。我认为EntityManager.remove
是正确的方法,但我想不是。
提前致谢!
编辑1:我觉得我应该注意oldObject.id == newObject.id。id
是通过 a 生成的@SequenceGenerator
。如果对象的标识符已经用生成器注释,我是否可以使用标识符持久化对象?
编辑2:根据此处最受好评的答案,因为@Id
已经定义并且它是一个自动生成的字段,Hibernate 认为它已分离。现在我知道为什么会出现异常,但解决方案仍不清楚。