gpt4 book ai didi

java - Hibernate 如何跟踪来自不同 session 的分离对象和持久对象

转载 作者:行者123 更新时间:2023-11-30 03:39:01 25 4
gpt4 key购买 nike

据我所知,Hibernate 会跟踪持久对象直到 session.close()。在 session.close() 之后,持久对象变成分离对象,并且 hibernate 不知道这个对象。

我对下面的两个代码示例有些困惑。

在第一个代码示例中:- 仅打开一个 session 并在 session.close() 之后保留一个对象,该对象将分离并且我们无法执行更新(例如 object.setName() )。

但在第二个代码示例中,我们使对象分离并对对象执行 setter ,然后再次打开 session 并更新此分离的对象。但是第二个 session 如何知道上面的 setter 值或更新..

package objectState;

import org.hibernate.Session;
import org.hibernate.Transaction;

import HibernateUtils.HibernateUtils;

public class ObjectStateTest {

public static void main(String[] args)
{

UserDetails user = new UserDetails(); // Transient Object
user.setUserName("Test User");

Session session = HibernateUtils.getFactory().openSession();
Transaction tx = session.beginTransaction();

session.save(user); //Persistent Object
user.setUserName("updated user"); //HB Keep Track Persistent Object & Perform Update if any change

tx.commit();
session.close();

user.setUserName("update after session closed"); // Detached Object (HB keep track Object until session.close() )
}

}

DetachedToPersistent.java

package objectState;

import org.hibernate.Session;
import org.hibernate.Transaction;

import HibernateUtils.HibernateUtils;

public class DetachedToPersistent {

public static void main(String[] args) {

UserDetails user = new UserDetails(); //Transient Object
user.setUserName("Test User");

Session session = HibernateUtils.getFactory().openSession();
Transaction tx = session.beginTransaction();

session.save(user); //Persistent Object

tx.commit();
session.close();

user.setUserName("update Detached User"); //Detached Object

session = HibernateUtils.getFactory().openSession();
tx = session.beginTransaction();

session.update(user); // Persistent Detached Object

tx.commit();
session.close();

}

}

可能是我理解有误,请指出我的错误..

谢谢:)

最佳答案

首先,我建议您阅读一些有关 entity state transitions 的内容。 。

  1. 附加对象时,持久性上下文使用 automatic dirty checking mechanism 检测更改。 .

  2. 当对象分离时(因为加载它的 session 已关闭),您可以:

    • 通过调用 session.merge(entity) 合并实体,获取新的副本并使用合并实体更新它。
    • 通过调用旧版 session.update(entity) 附加实体

merge method is preferred to update ,因此请尽可能使用合并。

关于java - Hibernate 如何跟踪来自不同 session 的分离对象和持久对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27202235/

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