Hibernate对象状态

3

我正在测试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")无法工作)。

然后我取消注释case B中的session.update(tag);,现在它可以正常工作。由于对象未合并到case B事务中,应该会产生错误。

我们可以说我们正在使用factory.getCurrentSession(),因此不需要合并它,但是如果将其替换为factory.openSession();并在每个案例后关闭会话,它仍然可以正常工作(在case B中调用update)。那么我们所说的对象分离是指什么意思呢?

1个回答

2

情况A: 会话未关闭,对象tag处于持久状态,并且该(tag)对象附加到当前会话。

情况B: 在这里,会话可能与第一次事务相同,您更改了处于持久状态的tag对象的值。 持久状态表示对象存在于永久存储中。内存中的对象和数据库之间通过标识符建立连接。这两者之一的任何更改都将在另一个中反映出来(当事务提交时)。持久状态取决于会话对象。首先,会话必须处于打开状态(未关闭) [在您的情况下是正确的] ,其次,对象必须连接到会话。如果这两者中的任何一个不成立,则对象将进入瞬态状态或分离阶段。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接