当前位置: 首页 > 面试题库 >

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

胡博艺
2023-03-14
问题内容

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

也来通过这个线程有什么优势依然存在(中)与保存()在Hibernate中?。我可以从此线程获取的有意义的语句是
persist(),还可以保证,如果在事务边界之外调用该语句,则该保存方法不会执行INSERT语句, 但是不确定如何在程序中尝试该 语句,
以便可以得到实际的区别?


问题答案:

我进行了一些模拟测试,以记录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中save()和persist()之间的区别,包括了Hibernate中save()和persist()之间的区别的使用技巧和注意事项,需要的朋友参考一下 Save()和这两种方法都用于在数据库中保存对象。  根据文档- Save()-坚持给定的瞬时实例,首先分配一个生成的标识符。(或者,如果使用分配的生成器,则使用标识符属性的当前值。)如果关联是用cascade

  • 本文向大家介绍请问,hibernate的 save() 和persist() 方法分别是做什么的?有什么区别?相关面试题,主要包含被问及请问,hibernate的 save() 和persist() 方法分别是做什么的?有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 考察点:session   Hibernate的对象有三种状态:瞬时态(transient)、持久态(persistent)

  • 问题内容: 谁能告诉我vs hibernate的优势是什么? 问题答案: 从此论坛帖子 定义明确。它使瞬态实例持久化。但是,它不能保证将标识符值立即分配给持久性实例,分配可能在刷新时发生。规范没有这么说,这是我的问题。 还保证如果在事务边界之外调用它,则不会执行INSERT语句。这在具有扩展会话/持久性上下文的长时间对话中很有用。 需要类似的方法。 不能保证相同,它返回一个标识符,如果必须执行IN

  • 问题内容: 之间有什么区别? 和: 这是什么意思? 问题答案: 用于保存软件包以用于开发目的。示例:单元测试,缩小 用于保存应用程序运行所需的软件包。

  • 问题内容: Hibernate中的persist()和merge()有什么区别? 可以创建UPDATE&INSERT查询,例如: 在这种情况下,将生成 查询, 如下所示: 因此方法可以 生成 一个插入和一个更新。 现在: 这是我在数据库中看到的: 现在使用更新记录 这是我在数据库中看到的: 问题答案: JPA规范包含对这些操作的语义的非常精确的描述,比在javadoc中更好: 应用于实体X 的 p

  • 我试图理解,何时何地使用这些标签,我明白一个是开发依赖项,另一个是项目依赖项,但是当将其用于实时项目时,我没有发现任何差异。我正在寻找一种方法,这将抛出错误的安装类型。有办法做到这一点吗?