据我所知,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 的内容。 。
附加对象时,持久性上下文使用 automatic dirty checking mechanism 检测更改。 .
当对象分离时(因为加载它的 session 已关闭),您可以:
- 通过调用
session.merge(entity)
合并实体,获取新的副本并使用合并实体更新它。 - 通过调用旧版
session.update(entity)
附加实体
- 通过调用
merge method is preferred to update ,因此请尽可能使用合并。
关于java - Hibernate 如何跟踪来自不同 session 的分离对象和持久对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27202235/