Java 休眠对象状态
我正在测试Hibernate,下面是情况和代码:Java 休眠对象状态,java,hibernate,object,state,Java,Hibernate,Object,State,我正在测试Hibernate,下面是情况和代码: public static void main(String[] args) { SessionFactory factory = HibernateUtil.getSessionFactory(); Tag tag; // (case A) Session session = factory.getCurrentSession(); Transaction tx = session.beginT
public static void main(String[] args) {
SessionFactory factory = HibernateUtil.getSessionFactory();
Tag tag;
// (case A)
Session session = factory.getCurrentSession();
Transaction tx = session.beginTransaction();
tag = (Tag) session.get(Tag.class, 1);
tag.setName("A");
tx.commit();
// session is automatically closed since it is current session and I am committing the transaction
// session.close();
//here the tag object should be detached
//(case B)
session = factory.getCurrentSession();
tx = session.beginTransaction();
// tag = (Tag) session.merge(tag); // I am not merging
tag.setName("B"); //changing
// session.update(tag);
tx.commit();
// session.close();
}
它不会更新案例B
(tag.setName(“B”)
不起作用)
然后我取消注释session.update(标记)代码>在案例B
中,现在它正在工作。由于对象未合并到案例B
事务,它应该给出错误
我们可以说我们使用的是factory.getCurrentSession()
,这就是为什么不需要合并它,但是如果用factory.openSession()替换它代码>并在每个案例后关闭会话,会话仍在工作(在案例B
中调用update)。那么在什么意义上我们称一个物体是分离的呢 案例A:
会话未关闭,对象标记处于持久状态,并且它(标记对象)与当前会话连接
案例B:
在这里,会话可能与第一个事务相同,您可以更改处于持久状态的标记对象的值<代码>持久状态表示永久存储器中存在对象。内存中的对象和数据库中的对象之间将通过标识符进行连接。这两个方面的任何更改都将反映在其他方面(提交事务时)。持久状态依赖于会话对象。首先,会话必须是打开的(未关闭的)
[在您的情况下是这样的],其次,对象必须连接到会话。如果这两种情况都不正确,则对象将进入瞬态或分离阶段。
在以下情况下,对象处于分离状态:
当持久状态对象未连接到会话对象时,会出现分离状态。没有连接可能是因为会话本身已关闭或对象已移出会话。