hibernate:更新和合并方法之间的区别

Posted

技术标签:

【中文标题】hibernate:更新和合并方法之间的区别【英文标题】:hibernate : difference between update and merge method 【发布时间】:2018-12-30 10:25:34 【问题描述】:

下面的代码显示了休眠的更新和合并方法之间的区别。但我仍然不明白为什么我们在这里需要第 13 行。如果我们不写第 13 行,是否可以在第 17 行的位置调用 session2.update(s1)

SessionFactory factory = cfg.buildSessionFactory();  //line no#1
Session session1 = factory.openSession();            //line no#2
                                                     //line no#3
Student s1 = null;                                   //line no#4
Object o = session1.get(Student.class, new Integer(101)); //line no#5
s1 = (Student)o;                                     //line no#6
session1.close();                                   //line no#7
                                                    //line no#8
s1.setMarks(97);                                    //line no#9
                                                    //line no#10
Session session2 = factory.openSession();           //line no#11
Student s2 = null;                                  //line no#12
Object o1 = session2.get(Student.class, new Integer(101)); //line no#13
s2 = (Student)o1;                                   //line no#14
Transaction tx=session2.beginTransaction();         //line no#15
                                                    //line no#16
session2.merge(s1);                                 //line no#17

【问题讨论】:

Hibernate update 应该用在我们知道我们只更新实体信息的地方。此操作将实体对象添加到持久上下文中,并在提交事务时跟踪和保存进一步的更改。 Hibernate 合并 可用于更新现有值,但是此方法从传递的实体对象创建一个副本并返回它。返回的对象是持久上下文的一部分,并跟踪任何更改,不跟踪传递的对象。这是 merge() 与所有其他方法的主要区别。 参考代码 sn-p,我的理解是,即使我们删除第 13 行和第 14 行,这也可以。第二种情况是如果我们删除第 13 行和第 14 行并编写更新方法而不是合并,那么它也可以工作。如果我错了,请纠正我? 【参考方案1】:

要了解差异,您首先需要了解休眠中的持久对象,这在以下答案中进行了解释 - What does persistence object means in Hibernate architecture?

简单来说,Persistent objects 是您创建的 POJO 类的实例,它们代表数据库中表中的行。 现在回到mergeupdate -

update 方法 使用给定分离实例的标识符更新持久实例。如果存在具有相同标识符的持久化实例,则抛出异常。

while merge 方法将给定对象的状态复制到具有相同标识符的持久对象上。如果当前没有与会话关联的持久实例,它将被加载。返回持久实例。如果给定实例未保存,则保存一份副本并将其作为新的持久实例返回。

【讨论】:

我理解了更新和合并之间的区别,仍然需要更清楚。在我从一些文章中得到的代码 sn-p 中。我不明白他为什么写第 13 行。我的理解是,即使我们删除第 13 行和第 14 行,这也会起作用。第二种情况是如果我们删除第 13 行和第 14 行并编写更新方法而不是合并,那么它也可以工作。对吗?

以上是关于hibernate:更新和合并方法之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate注解配置与XML配置区别

Hibernate 在尝试使用合并方法更新对象时抛出 DataIntegrityViolationException

Hibernate的merge()方法

ORM 解决方案(JPA;Hibernate)与 JDBC

Java 11:OSGi:生成 EntityManager,无法构建 Hibernate SessionFactory java.lang.ClassNotFoundException:org.hib

Hibernate参考文档