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

通过文档,我只能找到一个不同之处,即save方法生成将对象作为生成的标识符返回,但persist不是。这是提供persist方法的唯一目的。如果是的话,即使他不打算这样做对程序员也有帮助要使用生成的标识符,他可以使用save并忽略返回值。

也来通过这个线程有什么优势依然存在(中)与保存()在Hibernate中?。我可以从此线程获取的有意义的语句是

但是不确定如何在程序中尝试该

以便可以得到实际的区别?

回答:

我进行了一些模拟测试,以记录Save()和Persist()之间的区别。

听起来这两种方法在处理瞬态实体时行为相同,而在处理分离实体时则不同。

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

示例1:处理瞬态对象

                 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();

结果:您可能希望在上次会话中获得的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();

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

            Session session2 = factory.openSession();

session2.beginTransaction();

entity.setVehicleName("Toyota");

session2.persist(entity);

session2.getTransaction().commit();

session2.close();

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

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

以上是 Hibernate中的persist()和save()有什么区别? 的全部内容, 来源链接: utcz.com/qa/397982.html

回到顶部