使用EntityManager替换实体的最佳方法

Dep*_*sio 7 hibernate jpa entitymanager

我正在使用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
}
Run Code Online (Sandbox Code Playgroud)

此代码获得以下异常:

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)
Run Code Online (Sandbox Code Playgroud)

现在,它当然可行,如果不是删除实体,我只是更新其已更改的字段.但是,我只是被赋予了新的对象(UI通过REST将它扔给我),所以我真的不知道哪些字段已经改变,所以我必须更新每个字段.如果有大量的田地,那就不理想了.

我觉得我对如何正确删除有点困惑.我认为EntityManager.remove是正确的方式,但我猜不是.

提前致谢!

编辑1:我觉得我应该注意oldObject.id == newObject.id.在id通过产生@SequenceGenerator.如果标识符已经用生成器注释,我是否可以使用标识符来持久保存对象?

编辑2:根据这里最热门的答案,因为@Id已经定义了它并且它是一个自动生成的字段,Hibernate认为它已经分离了.现在我知道为什么我会得到例外,但解决方案仍然不清楚.

JB *_*zet 6

这是什么EntityManager.merge().将它传递给新的,分离的实体,它将其状态合并到旧的附加实体.分离的实体将保持分离状态,旧的实体将保持连接状态,但其状态将替换为新的独立实体的状态.