gpt4 book ai didi

java - hibernate 对象状态

转载 作者:搜寻专家 更新时间:2023-11-01 03:11:12 24 4
gpt4 key购买 nike

我这里是测试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();
}

它不会为 case B 更新(tag.setName("B") 不起作用)。

然后我在 case B 中取消注释 session.update(tag);,现在它可以工作了。由于对象未合并到 case B 交易,它应该给出错误。

我们可能会说我们正在使用 factory.getCurrentSession() 这就是为什么不需要合并它,但是如果用 factory.openSession(); 替换它并关闭每个案例之后的 session 仍然有效(在 case B 中调用更新)。那么在什么意义上我们称一个对象是分离的呢?

最佳答案

案例A: session 未关闭,对象 tag 处于持久状态并且它(标记对象)附加到当前 session 。

案例 B:这里的 session 可能与第一个事务相同,您更改处于持久状态的 tag 对象的值。 持久状态表示对象在永久存储中的存在。内存中的对象和数据库中的对象将通过标识符建立联系。这两者中任何一个的任何更改都将反射(reflect)在其他(提交事务时)。持久状态依赖于 session 对象。首先, session 必须打开(未关闭)[这在您的情况下是正确的],其次,对象必须连接到 session 。如果这两者中的任何一个不为真,则对象进入 transient 或分离阶段。

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

关于java - hibernate 对象状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9782812/

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