Hibernate saveOrUpdate vs update vs save / persist

时间:2014-09-07 09:49:39

标签: database hibernate persistence

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

saveOrUpdate - update - save/persist

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

What are the differences between the different saving methods in Hibernate?

Difference between save and saveOrUpdate method hibernate

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

id     |      company



1             Company1

2             Company2

然后执行代码:

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

我在数据库中看到:

id     |      company



 1             Company3

 2             Company4

我注意到savepersist在这种情况下执行与saveOrUpdateupdate相同的任务。因此,我的问题是它们之间的差异是什么?必需saveOrUpdateupdate。我是否正确使用savepersist相关对象即使使用Cascade也不会更新?

3 个答案:

答案 0 :(得分:11)

save()persist()都用于在数据库中插入 实体。您在数据库中已存在的实体上调用它们。所以他们什么都不做。

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

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

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

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

User user1 = (User) session.load(User.class, Integer.valueOf(1));
user1.setCompany("Company3");

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

答案 1 :(得分:4)

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

<强>更新 hibernate中的Update方法用于使用标识符更新对象。如果标识符丢失或不存在,则会抛出异常。

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

答案 2 :(得分:-1)

saveOrUpdate - 如果数据库中不存在,则插入一行;如果存在,则更新它。

save - 总是尝试在数据库中插入一行。

update - 始终尝试更新数据库中的行。 使用saveOrUpdate的示例。

假设您开发了一个程序,该程序从Google Analytics获取当天用户访问的相关信息并将其保存到您的数据库中。

如果数据库中没有关于当天的信息,方法saveOrUpdate将插入数据,否则将更新现有数据。