gpt4 book ai didi

java - 在 Hibernate 中更新包含列表的对象

转载 作者:搜寻专家 更新时间:2023-10-30 20:06:02 25 4
gpt4 key购买 nike

在我的 GWT 应用程序中,我将对象传递给服务器以使用 Hibernate 进行持久化。此对象包含另一个对象的列表。列表中的每个元素都包含一个 Map,它是另一个 Hibernate 表。

为了进行此交易,据我了解,我必须首先:

  1. 执行查找以从数据库中获取持久对象 hibernate
  2. 修改对象
  3. 通过 hibernate 更新对象

这是我正在做的一些快速代码:

public void saveOrUpdateObject(final Foo foo)
{
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();

Object lookup = myDAO.getObject(foo.getUniqueValue());

if (lookup != null) {
lookup.getList().clear();
lookup.addAll(foo.getList());

myDAO.update(lookup);
}
else {
myDAO.save(foo);
}
}

使用这种方法,我偶尔会得到一个 HibernateException:

org.hibernate.HibernateException: A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance: my.Foo.list

使用 Hibernate 更新包含集合的对象的正确方法是什么?

最佳答案

问题与同时拥有托管和非托管对象有关:

  • lookup 是一个托管对象,lookup.list 和其中的所有内容也是如此
  • foo 不是托管对象,foo.list 中也不是任何对象

当您调用 lookup.getList().clear() 时,您向 Hibernate 发出信号,表明该托管列表中的所有内容都需要删除(由于 all-delete-orphan 级联)。但是,您随后返回并向该(托管)列表添加一堆内容,包括一些可能已经存在的内容。 Hibernate 感到困惑并抛出异常。

不是手动调整托管对象的列表,而是使用 merge(foo) 用非托管实例更新持久实例的状态。来自Hibernate manual :

if there is a persistent instance with the same identifier currently associated with the session, copy the state of the given object onto the persistent instance

合并将确定更新哪个状态的责任交给了 Hibernate。

关于java - 在 Hibernate 中更新包含列表的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7522467/

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