繁体   English   中英

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

[英]Hibernate - difference update using save() method vs. update using update() method

我有一个简单的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的Object,更改值,使用save()方法将其标记为持久并提交事务。 我观察到Hibernate在这种情况下会生成UPDATE语句。

因此,如果我可以使用save()方法以这种方式进行UPDATE,则使用update()方法进行更新有何不同?

喜欢

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

保存(方法)

save方法是一种不符合JPA规范的“原始”休眠方法。

它的目的与persist基本相同,但是实现细节不同。 该方法的文档严格声明其保留实例,“首先分配生成的标识符”。 保证该方法返回此标识符的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。 在分离的实例上调用save会创建一个新的持久性实例,并为其分配一个新的标识符,这将在提交或刷新后在数据库中产生重复的记录。

更新(方法)

与persist and save一样,update方法是一种“原始” Hibernate方法,在添加merge方法之前很久就存在。 其语义在几个关键点上有所不同:

它对传递的对象起作用(其返回类型为void); update方法将传递的对象从分离状态转换为持久状态; 如果将瞬态实体传递给此方法,则此方法将引发异常。 在下面的示例中,我们保存对象,然后将其从上下文中逐出(分离),然后更改其名称并调用update。 注意,我们没有将更新操作的结果放在单独的变量中,因为更新发生在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!

有关更多信息,请点击此链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM