【问题标题】:Hibernate - difference update using save() method vs. update using update() methodHibernate - 使用 save() 方法更新与使用 update() 方法更新的差异
【发布时间】:2018-08-20 13:21:20
【问题描述】:

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

所以下面的代码对我有用。

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

【问题讨论】:

    标签: java hibernate object persistence


    【解决方案1】:

    保存(方法)

    save 方法是一个“原始”的 Hibernate 方法,它不 符合 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。对分离的保存的调用 instance 创建一个新的持久实例并为其分配一个新的 标识符,这会导致数据库中的重复记录 提交或刷新。

    更新(方法)

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

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

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

    尝试在瞬态实例上调用更新将导致 例外。以下将不起作用:

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

    更多信息请关注link

    【讨论】:

      猜你喜欢
      • 2015-04-18
      • 2019-05-31
      • 2015-09-10
      • 2014-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-28
      相关资源
      最近更新 更多