休眠中的更新与合并方法

新手上路,请多包涵

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

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

原文由 Daniel 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 413
2 个回答

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

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

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

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

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

原文由 Adya 发布,翻译遵循 CC BY-SA 3.0 许可协议

在合并的情况下: 当我们在分离实例上调用合并方法时,它会用更新后的值更新它。

在更新的情况下 当我们在分离实例上调用更新方法时,它将给出异常 org.hibernate.NonUniqueObjectException

原文由 Sumit Singh 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题