在当前会话中对hibernate中的分离对象执行合并后,是否会跟踪对象的更改?

时间:2013-09-27 05:57:13

标签: java hibernate session merge ejb-3.0

在容器管理事务中,我得到一个分离的对象并合并它,以便分离的对象进入托管状态。我的初始问题是通过缓存Pojo java对象和合并是一个更好的想法,让对象进入会话或从数据库获取数据以进入会话上下文在从DB获取数据所涉及的操作成本/时间方面更好的想法?如果我在开始时执行合并以使对象进入会话上下文并对这个合并对象进行修改,hibernate将负责生成所有必需的sql语句,最后是否需要注意?

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

2 个答案:

答案 0 :(得分:0)

  

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

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

此外,这将更好地执行,因为对象在结束时被移动到持久上下文,因此Hibernate不必在结束时进入画面。

答案 1 :(得分:0)

当您调用detach然后合并时,merge会在上下文中返回附加的实体。用户在合并操作之后使用传递的实体希望可以管理但是情况并非如此,这是一个常见的错误。您必须使用将由hibernate管理的合并中返回的实体,并且后续更改将在事务结束时自动刷新。 当你加载你的实体时,它并不重要。如果它已经没有在上下文中加载,那么hibernate会反正触发一个select。即使您继续对托管实体进行更改,hibernate也会在您退出事务或显式调用flush()时触发更新。