【问题标题】:update vs merge method in hibernate休眠中的更新与合并方法
【发布时间】:2020-08-13 03:57:07
【问题描述】:

我了解,如果没有具有相同 id 和类型的其他对象附加到会话,则使用更新将分离的对象置于持久状态。合并不关心状态。如果会话中不存在相同类型的持久对象,或者它使用新对象的值更新旧对象,它只会返回相同类型的持久对象。我的问题是关于数据库命中的。方法“更新”和“合并”是否立即命中数据库?或者当会话关闭时,数据库中的更改会很明显。

编辑:如果我们通过 save 方法在持久化实例上调用 update 方法会发生什么?我以为更新方法只是用于分离的实例。

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    当会话被刷新时,Hibernate 会处理持久化会话中对象的任何更改。如果对象的实例已经在会话中,更新可能会失败。在这种情况下应该使用合并。如果存在,它将分离对象的更改与会话中的对象合并。

    更新:如果您确定会话不包含具有相同标识符的已持久实例,则使用更新将数据保存在休眠中

    合并:如果您想在不知道会话状态的情况下随时保存修改,请在休眠中使用 merge()。

    当实体实例处于持久状态时,您对该实例的映射字段所做的所有更改都将在刷新 Session 时应用于相应的数据库记录和字段。持久化实例可以被认为是“在线的”,而分离的实例已经“离线”并且不会被监控变化。

    这意味着当您更改持久对象的字段时,您不必调用 save、update 或任何这些方法来获取对数据库的这些更改:您只需要提交事务、刷新或完成后关闭会话。 重要的是要理解所有方法(persist、save、update、merge、saveOrUpdate)不会立即导致相应的 SQL UPDATE 或 INSERT 语句。 在提交事务或刷新会话时将数据实际保存到数据库中

    【讨论】:

    • 我同意你所说的一切。你说:“Merge 方法将合并对象的两种状态的更改,并且 --> 将保存在数据库中
    • 我已经编辑了我的答案,请看看是否解决了您的问题。
    • 如果 hibernate 主动跟踪持久对象的任何更新或更改,并且如果有任何更新完成,那么它会在调用 flush/commit 时自动将这些更改获取到数据库中。那为什么需要更新方法呢?
    【解决方案2】:

    如果合并: 当我们在分离的实例上调用 merge 方法时,它会用更新的值更新它。

    如有更新 当我们在分离的实例上调用更新方法时,它会给出异常org.hibernate.NonUniqueObjectException

    【讨论】:

      【解决方案3】:

      hibernate中的所有方法

      • 保存

      • 合并

      • 保存或更新

      • 更新

      • 删除

      不会立即导致 sql 更新或插入语句。

      数据的实际保存发生在我们提交或刷新会话时。

      【讨论】:

        【解决方案4】:

        有时我们会遇到这样的情况,即我们的应用程序数据库被一些外部应用程序/代理修改,因此您的应用程序中相应的休眠实体实际上与它的数据库表示不同步,即拥有旧数据。在这种情况下,您可以使用session.refresh() 方法使用数据库中可用的最新数据重新填充实体。

        您可以使用 Session 接口上的refresh() 方法之一来刷新持久对象的实例 方法merge() 的作用与refresh() 的作用完全相反,即它使用来自分离实体的值更新数据库。 Refresh 方法正在使用最新的数据库信息更新实体。所以基本上,两者是完全相反的。

        当您希望将分离实体再次更改为持久状态时执行合并,分离实体的更改已迁移到(或覆盖)数据库。

        Hibernate官方文档对merge()方法给出了很好的解释:

        将给定对象的状态复制到具有相同标识符的持久对象上。如果当前没有与会话关联的持久实例,它将被加载。返回持久实例。如果给定实例未保存,则保存副本并将其作为新的持久实例返回。给定的实例不会与会话关联。如果关联与cascade=”merge” 映射,则此操作级联到关联实例。

        Reference

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-08-11
          • 2023-03-17
          • 2015-05-13
          • 2012-02-09
          • 1970-01-01
          • 2011-07-15
          • 2011-04-06
          相关资源
          最近更新 更多