Hibernate saveOrUpdate vs update vs save/persist

arj*_*soh 8 database persistence hibernate

我正在努力理解hibernate方法之间的细微差别

saveOrUpdate - update - save/persist.

我知道网站上有一些类似的问题:

Hibernate中不同的保存方法有什么区别?

save和saveOrUpdate方法之间的区别是hibernate

但是看过它们之后,我没有注意到答案涵盖了在任何情况下使用这些方法产生的所有问题.我想提一下我创建的测试示例:我有一个带有记录的表USER:

id     |      company



1             Company1

2             Company2
Run Code Online (Sandbox Code Playgroud)

然后执行代码:

 Session session = HibernateUtil.getSessionFactory().getCurrentSession();
 Transaction tx = session.beginTransaction();

 User user1 = (User) session.load(User.class, Integer.valueOf(1));
 user1.setCompany("Company3");
 User user2 = (User) session.load(User.class, Integer.valueOf(2));
 user2.setCompany("Company4");
 session.persist(user1);
 session.save(user2);

 tx.commit();
Run Code Online (Sandbox Code Playgroud)

我在数据库中看到:

id     |      company



 1             Company3

 2             Company4
Run Code Online (Sandbox Code Playgroud)

我注意到save并且persist在这种情况下执行与saveOrUpdate或相同的任务.update因此,我的问题是什么是它们之间的差异以及何时saveOrUpdateupdate必要.我说得对,与savepersist不更新相关的对象,即使使用Cascade

JB *_*zet 14

双方save()persist()用来插入一个新的数据库中的实体.您在数据库中已存在的实体上调用它们.所以他们什么都不做.

它们之间的主要区别在于save()Hibernate专有,而persist()标准的JPA方法.此外,save()保证为实体分配和返回ID,而persist()不是.

update() 用于将分离的实体附加到会话.

saveOrUpdate() 用于根据实体的状态(新的或分离的)保存或更新实体.

请注意,您无需调用会话的任何方法来修改附加实体:执行

User user1 = (User) session.load(User.class, Integer.valueOf(1));
user1.setCompany("Company3");
Run Code Online (Sandbox Code Playgroud)

足以让数据库中的用户1的公司更新.Hibernate检测对附加实体所做的更改,并自动将它们保存在数据库中.

  • merge 不会将其参数附加到会话中。它获取与参数具有相同 ID(和类型)的附加实体,然后将参数的状态复制到附加实体。merge() 是标准的 JPA 方法。saveOrUpdate() 和 update() 是专有的 Hibernate 方法。一般来说,你应该使用merge()。 (2认同)
  • **附加**实体的状态会自动保存到数据库中.`update()`用于获取**分离的**实体并将其附加到会话.你不需要*update()(它在JPA中不存在),但它可能很有用,并且与merge()不同.我再说一遍,merge()不会将对象附加到会话中.它将分离的实体的状态复制到具有相同ID的附加实体. (2认同)

小智 5

save 方法将对象存储到数据库中。这意味着如果标识符不存在,它将插入一个条目,否则将引发错误。如果表中已经存在主键,则无法将其插入。

update 休眠中的Update方法用于使用标识符更新对象。如果标识符丢失或不存在,它将引发异常。

saveOrUpdate 此方法根据操作调用save()或update()。如果标识符存在,它将调用update方法,否则将调用save方法。saveOrUpdate()方法执行以下操作:如果该对象在当前会话中已经存在,则不执行任何操作。如果与该会话关联的另一个对象具有相同的标识符,则将异常抛出给调用方。如果该对象没有标识符属性,则save( )对象如果对象的标识符具有分配给新实例化的对象的值,请保存()该对象-有关更多信息,请参见:http : //www.javabeat.net/difference-between-hibernates-saveupdate-and-saveorupdate-methods /#sthash.ZwqNlWXH.dpuf