8

我正在使用 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 认为它已分离。现在我知道为什么会出现异常,但解决方案仍不清楚。

4

1 回答 1

7

就是EntityManager.merge()这样。将新的分离实体传递给它,它会将其状态合并到旧的附加实体。分离的实体将保持分离状态,旧的实体将保持连接状态,但其状态将被新的分离实体的状态替换。

于 2013-05-31T22:13:08.430 回答