我知道如果没有其他具有相同 ID 和类型的对象附加到会话,更新用于将分离的对象置于持久状态。 Merge 不关心状态。如果它不存在于会话中,它只返回一个相同类型的持久对象,或者它用新对象的值更新旧对象。我的问题是关于数据库命中率。 “更新”和“合并”方法是否立即命中数据库?或者当会话关闭时,数据库中的更改很明显。
编辑:如果我们通过保存方法在持久化实例上调用更新方法会发生什么?我以为 update 方法只是用在分离的实例上。
原文由 Daniel 发布,翻译遵循 CC BY-SA 4.0 许可协议
当刷新会话时,Hibernate 处理持久化会话中对象的任何更改。如果对象的实例已经在会话中,则更新可能会失败。在这种情况下应该使用合并。它将分离对象的更改与会话中的对象(如果存在)合并。
更新:如果您确定会话不包含具有相同标识符的已经持久化的实例,则使用更新将数据保存在休眠状态
合并:如果你想在不知道会话状态的情况下随时保存你的修改,那么在休眠中使用 merge() 。
当实体实例处于持久状态时,您对该实例的映射字段所做的所有更改都将在刷新会话时应用到相应的数据库记录和字段。持久实例可以被认为是“在线”的,而分离实例已经“离线”并且没有被监视变化。
这意味着当您更改持久对象的字段时,您不必调用保存、更新或任何这些方法来将这些更改保存到数据库中:您只需提交事务、刷新或关闭会话,当你完成它时。重要的是要了解所有方法(坚持、保存、更新、合并、saveOrUpdate)不会立即导致相应的 SQL UPDATE 或 INSERT 语句。 将数据实际保存到数据库发生在提交事务或刷新 Session 时。