gpt4 book ai didi

java - hibernate何时从内存中删除分离的对象?非唯一对象异常

转载 作者:行者123 更新时间:2023-12-01 21:33:53 25 4
gpt4 key购买 nike

我明白了NonUniqueObjectException什么时候发生以及为什么发生。

我在互联网上看到了很多 NonUniqueObjectException 的例子,每个例子都有相同的内容。对象首先与 session1 分离,因此 session1 也被关闭并清除,然后具有相同标识符的对象在 session2 中更新或 SaveorUpdate。

代码片段:

 Session session = sessionFactory1.openSession();
Transaction tx = session.beginTransaction();
Item item = (Item) session.get(Item.class, new Long(1234));
tx.commit();
session.close(); // end of first session, item is detached
item.getId();// The database identity is "1234" item.setDescription("my new description");
Session session2 = sessionFactory.openSession();
Transaction tx2 = session2.beginTransaction();
Item item2 = (Item) session2.get(Item.class, new Long(1234));
session2.update(item);// Throws NonUniqueObjectException
tx2.commit();
session2.close();

我的问题是,即使 seesion1 已关闭,为什么 hibernate 仍将分离的对象保留在 session1 中,但不对其进行管理。何时从 session1 中删除所有对象。

最佳答案

Hibernate 保留对分离对象的引用,即分离对象不是任何 session 的一部分,并且它们的垃圾收集不会以任何方式受到阻碍。

NonUniqueObjectException 的原因是同一数据库行的两个不同对象已与同一 session 关联。这很糟糕,因为 Hibernate 会自动检测 session 中对象的更改,并将这些更改写回数据库。如果同一行的多个对象位于同一 session 中,则应该写入哪个对象的状态是不明确的。因为这会导致很难发现错误,Hibernate 拒绝这种情况。

通常,Hibernate 确保给定 session 中对行的所有查询都返回相同的对象,因此不会出现这种情况。但是,如果您在新 session 中使用从不同 session 获取的对象,则该对象将与新 session 关联,如果新 session 已包含该行的对象,则该操作可能会失败。

这就是为什么较新的 EntityManager API 不再具有将预先存在的对象与 session 关联的 update 方法,而是使用复制 session 的 merge 方法。对象的内容放入与 session 关联的对象中。

关于java - hibernate何时从内存中删除分离的对象?非唯一对象异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37184292/

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