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 类的实例,它们代表数据库中表中的行。
现在回到merge
和update
-
update
方法 使用给定分离实例的标识符更新持久实例。如果存在具有相同标识符的持久化实例,则抛出异常。
while merge
方法将给定对象的状态复制到具有相同标识符的持久对象上。如果当前没有与会话关联的持久实例,它将被加载。返回持久实例。如果给定实例未保存,则保存一份副本并将其作为新的持久实例返回。
【讨论】:
我理解了更新和合并之间的区别,仍然需要更清楚。在我从一些文章中得到的代码 sn-p 中。我不明白他为什么写第 13 行。我的理解是,即使我们删除第 13 行和第 14 行,这也会起作用。第二种情况是如果我们删除第 13 行和第 14 行并编写更新方法而不是合并,那么它也可以工作。对吗?以上是关于hibernate:更新和合并方法之间的区别的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate 在尝试使用合并方法更新对象时抛出 DataIntegrityViolationException
Java 11:OSGi:生成 EntityManager,无法构建 Hibernate SessionFactory java.lang.ClassNotFoundException:org.hib