我正在开展web项目,我希望将用户更新到数据库中。 在编写代码时,我发现如果用作
则会出错getHibernateTemplate()。update(用户)“非法尝试将集合与两个打开的会话相关联”;
但是,如果我使用getHibernateTemplate().merge(user);
尝试相同,那么它完全正常。
这两者有什么区别?什么是开放会议的确切含义?
答案 0 :(得分:7)
合并可以跨会话使用,而更新仅适用于同一会话。
虽然两者都用于转换处于其分离状态的对象以将对象转换为其持久状态,但只有当我们处于同一会话时更新才会起作用,但即使其不同的会话,合并也会起作用。 / p>
了解更多info。
通过开放会话,这意味着您当前正在同一会话中执行操作(即在关闭会话之前)
答案 1 :(得分:3)
每当你尝试一次又一次地将同一个对象加载到数据库中时,更新和合并就会出现在图片中。
在update()中如果在保存到数据库之前修改对象,那么hibernate会抛出错误,因为我们只能在会话中更新对象。
在merge()中,打开的会话和上一个会话将合并在一起,对象将保存在数据库中。
答案 2 :(得分:0)
hibernate中的update()和merge()方法都用于将处于分离状态的对象转换为持久状态。 见下面的代码:
SessionFactory factory = cfg.buildSessionFactory();
Session session1 = factory.openSession();
Student s1 = null;
Object o = session1.get(Student.class, new Integer(101));
s1 = (Student)o;
session1.close();
s1.setMarks(97);
Session session2 = factory.openSession();
Student s2 = null;
Object o1 = session2.get(Student.class, new Integer(101));
s2 = (Student)o1;
Transaction tx=session2.beginTransaction();
session2.merge(s1);
*听到s1处于分离状态,现在如果我们调用update()方法,那么hibernate会抛出一个错误,因为我们只能在会话中更新对象
*所以我们打开了另一个会话[session2],并再次从数据库加载了相同的学生对象,但名称为s2
*所以在这个session2中,我们调用了session2.merge(s1);现在进入s2对象的s1更改将被合并并保存到数据库中