gpt4 book ai didi

hibernate - Hibernate 中的 persist() 和 save() 有什么区别?

转载 作者:太空宇宙 更新时间:2023-11-04 11:16:46 24 4
gpt4 key购买 nike

通过文档,我只能发现一个区别,即 save 方法生成返回对象作为生成的标识符,但 persist 不会。这是提供 persist 方法的唯一目的吗。如果是,它对程序员有何帮助,因为即使他不打算使用生成的标识符,他也可以使用 save 并忽略返回值。

也通过此线程What's the advantage of persist() vs save() in Hibernate? 。我可以从这个线程得到的有意义的语句是 persist() 还保证,如果在保存方法执行的事务边界之外调用它,它不会执行 INSERT 语句 但不确定我应该如何在我的程序中尝试它,以便我可以获得实际的差异?

最佳答案

我做了一些模拟测试来记录Save()和Persist()之间的区别。

听起来这两种方法在处理 transient 实体时表现相同,但在处理分离实体时表现不同。

对于下面的示例,将 EmployeeVehicle 作为实体,将 PK 作为生成的值vehicleId,将vehicleName 作为其属性之一。

示例 1:处理 transient 对象

                 Session session = factory.openSession();
session.beginTransaction();
EmployeeVehicle entity = new EmployeeVehicle();
entity.setVehicleName("Honda");
session.save(entity);
// session.persist(entity);
session.getTransaction().commit();
session.close();

结果:select nextval ('hibernate_sequence')//这是针对生成的车辆 ID:36

insert into Employee_Vehicle ( Vehicle_Name, Vehicle_Id) values ( Honda, 36)

Repeat the same with using persist(entity) and will result the same with new Id ( say 37 , honda ) ;

示例 2:处理分离对象

// Session 1 
// Get the previously saved Vehicle Entity
Session session = factory.openSession();
session.beginTransaction();
EmployeeVehicle entity = (EmployeeVehicle)session.get(EmployeeVehicle.class, 36);
session.close();

// Session 2
// Here in Session 2 , vehicle entity obtained in previous session is a detached object and now we will try to save / persist it
(i) Using Save() to persist a detached object
Session session2 = factory.openSession();
session2.beginTransaction();
entity.setVehicleName("Toyota");
session2.save(entity);
session2.getTransaction().commit();
session2.close();

结果:您可能期望在上一次 session 中获得的 id 为 36 的车辆已更新为名称“Toyota”。但发生的情况是,数据库中保存了一个新实体,并为其生成了新的 ID,名称为“Toyota”

         select nextval ('hibernate_sequence')
insert into Employee_Vehicle ( Vehicle_Name, Vehicle_Id) values ( Toyota, 39)

(ii) Using Persist() to persist a detached object

// Session 1
Session session = factory.openSession();
session.beginTransaction();
EmployeeVehicle entity = EmployeeVehicle)session.get(EmployeeVehicle.class, 36);
session.close();

// session 2//在 session 2 中,上一个 session 中获得的车辆实体是一个分离的对象,现在我们将尝试保存/持久化它(i) 使用 persist() 持久化一个分离的对象

            Session session2 = factory.openSession();
session2.beginTransaction();
entity.setVehicleName("Toyota");
session2.persist(entity);
session2.getTransaction().commit();
session2.close();

结果:抛出异常:分离的实体传递给持久化

因此,最好使用 Persist() 而不是 Save(),因为在处理 session 和事务时必须谨慎使用 save。

关于hibernate - Hibernate 中的 persist() 和 save() 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45386565/

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