我知道,如果没有其他具有相同ID和类型的对象附加到会话中,则使用update会将分离的对象置于持久状态。合并不关心状态。如果会话中不存在相同类型的持久对象,或者它使用新对象的值更新旧对象,则它只会返回该对象。我的问题是关于数据库命中的问题。方法“更新”和“合并”是否立即击中数据库?或关闭会话后,数据库中的更改显而易见。
编辑:如果我们通过save方法在持久化实例上调用update方法会发生什么?我认为更新方法仅用于分离的实例。
刷新会话时,Hibernate处理将对会话中的对象所做的任何更改持久化。如果对象的实例已经在会话中,则更新可能会失败。在这种情况下,应使用合并。它将分离对象的更改与会话中的对象(如果存在)合并。
更新:如果您确定该会话不包含具有相同标识符的已经存在的实例,则使用更新将数据保存在hibernate状态
合并:如果您想在不知道会话状态的情况下随时保存修改,请在hibernate状态下使用merge()。
当实体实例处于持久状态时,在刷新会话时,您对此实例的映射字段所做的所有更改都将应用于相应的数据库记录和字段。可以将持久实例视为“联机”,而分离的实例已变为“脱机”并且不受监视以进行更改。
这意味着,当您更改持久对象的字段时,无需调用save,update或任何这些方法即可将这些更改获取到数据库:您所需要做的只是提交事务,或刷新或关闭会话,当您完成后。重要的是要了解所有方法(持久,保存,更新,合并,saveOrUpdate)不会立即导致相应的SQL UPDATE或INSERT语句。 将数据实际保存到数据库是在提交事务或刷新Session时发生的 。