gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:09:28 25 4
gpt4 key购买 nike

我正在使用 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 向我抛出它),所以我真的不知道哪些字段发生了变化,所以我必须更新每个字段。如果有大量的字段,那并不理想。

我想我对如何正确地进行删除有点困惑。我以为 EntityManager.remove是正确的方法,但我想不是。

提前致谢!

编辑 1:我觉得我应该注意 oldObject.id == newObject.id。 id是通过 @SequenceGenerator 生成的.如果它们的标识符已经用生成器注释了,我是否允许使用标识符持久化对象?

编辑 2:根据最高投票的答案 here ,因为 @Id已经定义并且它是一个自动生成的字段,Hibernate 认为它是分离的。现在我知道为什么会出现异常,但解决方案仍不清楚。

最佳答案

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

关于hibernate - 使用 EntityManager 替换实体的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16866733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com