在当前会话中对休眠中的分离对象执行合并后,将跟踪对象上的更改



在容器管理的事务中,我得到一个分离的对象并合并它,以便将分离的对象带入托管状态。我最初的问题是,通过缓存 Pojo java 对象并合并是将对象放入会话或执行从数据库获取数据以进入会话上下文的更好主意,就操作成本/从数据库获取数据所涉及的时间而言,这是一个更好的主意?如果我在开始时执行合并以将对象放入会话上下文并对此合并的对象进行修改,休眠会负责生成所有必需的sql语句,最后会处理吗?

请评论哪个是将实体带到会话的更好方法,使用缓存分离对象的合并或从数据库中获取数据是更少的时间消耗?

当您调用分离然后合并时,合并将返回上下文中的附加实体。 用户在合并操作后使用传递的实体希望对其进行管理是一个常见的错误,但事实并非如此。 您必须使用来自 Merge 的返回实体,该实体将由 Hibernate 管理,后续更改将在事务结束时自动刷新。加载实体时无关紧要,因为如果上下文中尚未加载,则休眠无论如何都会触发选择。此外,即使您继续对托管实体进行更改,Hibernate 也只会在您退出事务或显式调用 flush(( 时触发更新。

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

根据 API,它会在您执行合并时保存副本,然后返回一个新实例。根据我的经验,在对处于分离状态的对象执行所有更新后,最好在最后合并。它更好,因为只有在对象状态准备好持久化时,您才会在最后调用合并操作。

此外,这将表现得更好,因为对象在最后被移动到持久上下文中,因此 Hibernate 不必在最后进入图片。

最新更新