Java getHibernateTemplate().update和getHibernateTemplate().merge之间有什么区别

Java getHibernateTemplate().update和getHibernateTemplate().merge之间有什么区别,java,spring,hibernate,Java,Spring,Hibernate,我正在进行一个web项目,我想将用户更新到数据库中。 在编写代码时,我发现如果用作 getHibernateTemplate()。更新(用户)“非法尝试将集合与两个打开的会话关联;” 但是如果我使用getHibernateTemplate().merge(user)尝试同样的方法它工作得非常好。 这两者有什么区别?开放会话的确切含义是什么?合并可以跨会话工作,而更新只适用于同一会话 虽然两者都用于将对象转换为其分离状态,以将对象转换为其持久化状态,但仅当我们处于同一会话中时,更新才会起作用,但即

我正在进行一个web项目,我想将用户更新到数据库中。 在编写代码时,我发现如果用作

getHibernateTemplate()。更新(用户)“非法尝试将集合与两个打开的会话关联;”

但是如果我使用
getHibernateTemplate().merge(user)尝试同样的方法它工作得非常好。

这两者有什么区别?开放会话的确切含义是什么?

合并可以跨会话工作,而更新只适用于同一会话

虽然两者都用于将对象转换为其分离状态,以将对象转换为其持久化状态,但仅当我们处于同一会话中时,更新才会起作用,但即使它处于不同会话中,合并也会起作用

更多


通过打开会话,这意味着您当前正在同一会话中执行操作(即在关闭会话之前)

每当您尝试将同一对象反复加载到数据库中时,在这种情况下,更新和合并将出现在图片中

在update()中,如果在保存到数据库之前修改对象,则hibernate将抛出错误,因为我们只能在会话中更新对象

在merge()中,打开的会话和上一个会话将合并在一起,对象将保存在数据库中。

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],再次从数据库中加载相同的student对象,但名称为s2


*所以在这个session2中,我们称之为session2.merge(s1);现在,s2对象s1的更改将被合并并保存到数据库中

嘿,再见,非常感谢你的回复,这澄清了我对合并和更新的想法