休眠-使用save()方法进行差异更新与使用update()方法进行差异更新

时间:2018-08-20 13:21:20

标签: java hibernate object persistence

我有一个简单的Hibernate项目,其中我使用save方法更新了一个现有Object。

因此以下代码对我有用。

sessionObj.beginTransaction();
MyObject myObj = sessionObj.get(MyObject.class, objID);
myObj.setPropertyA("new value");
sessionObj.save(myObj);
sessionObj.getTransaction().commit(); 

我通过get()方法获得ID为objID的对象,更改值,使用save()方法将其标记为持久对象并提交事务。我观察到Hibernate在这种情况下会生成UPDATE语句。

因此,如果我可以使用save()方法进行这种更新,那么使用update()方法进行更新有什么区别呢?

喜欢

MyObject myObj = sessionObj.get(MyObject.class, objID);
myObj.setPropertyA("new value");
sessionObj.update(myObj);

1 个答案:

答案 0 :(得分:0)

保存(方法)

  

save方法是“原始”休眠方法,不会   符合JPA规范。

     

其目的与持久性基本相同,但有不同之处   实施细节。此方法的文档严格   声明它保留实例,“首先分配一个生成的   标识符”。该方法保证返回Serializable值   标识符。

Person person = new Person();
person.setName("John");
Long id = (Long) session.save(person);
  

保存已经持久的实例的效果与   坚持。尝试保存分离的实例时会有所不同:

Person person = new Person();
person.setName("John");
Long id1 = (Long) session.save(person);

session.evict(person);
Long id2 = (Long) session.save(person);
  

id2变量将不同于id1。保存在一个独立的电话   实例创建一个新的持久实例并为其分配一个新的实例   标识符,导致在数据库中出现重复记录   提交或刷新。

更新(方法)

  

与persist and save一样,更新方法是“原始”的Hibernate   在添加合并方法之前很久就存在的方法。它的   语义在几个关键点上有所不同:

     

它作用于传递的对象(其返回类型为void);更新   方法将传递的对象从分离状态转换为持久性   州;如果您将其传递给瞬态,则此方法将引发异常   实体。在下面的示例中,我们保存对象,然后逐出   (将其与上下文分离),然后更改其名称并调用更新。   请注意,我们没有将更新操作的结果放在   单独的变量,因为更新发生在person对象上   本身。基本上,我们将现有实体实例重新附加到   持久性上下文– JPA规范没有   允许我们这样做。

Person person = new Person();
person.setName("John");
session.save(person);
session.evict(person);

person.setName("Mary");
session.update(person);
  

尝试在瞬态实例上调用update会导致   例外。以下内容将不起作用:

Person person = new Person();
person.setName("John");
session.update(person); // PersistenceException!

有关更多信息,请遵循此link