栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

我进行了一些模拟测试,以记录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。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/397716.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号