我有一个简单的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);
答案 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