Java 休眠对象状态

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

我正在测试Hibernate,下面是情况和代码:

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: 在这里,会话可能与第一个事务相同,您可以更改处于持久状态的
标记
对象的值<代码>持久状态表示永久存储器中存在对象。内存中的对象和数据库中的对象之间将通过标识符进行连接。这两个方面的任何更改都将反映在其他方面(提交事务时)。持久状态依赖于会话对象。首先,会话必须是打开的(未关闭的)
[在您的情况下是这样的]
,其次,对象必须连接到会话。如果这两种情况都不正确,则对象将进入瞬态或分离阶段。

在以下情况下,对象处于分离状态:
当持久状态对象未连接到会话对象时,会出现分离状态。没有连接可能是因为会话本身已关闭或对象已移出会话。