0

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

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

4

2 回答 2

0

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

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

这也将表现得更好,因为对象在最后被移动到持久上下文中,因此 Hibernate 直到最后都不会出现。

于 2013-09-27T06:26:47.440 回答
0

当您调用分离然后合并时,合并会在上下文中返回您附加的实体。这是一个常见的错误,用户会在合并操作后使用传递的实体,希望可以对其进行管理,但事实并非如此。您必须使用从合并返回的实体,该实体将由休眠管理,后续更改将在事务结束时自动刷新。当你加载你的实体时这并不重要,因为如果它已经没有在上下文中加载,那么休眠无论如何都会触发一个选择。即使您继续对托管实体进行更改,hibernate 也只会在您退出事务或显式调用 flush() 时触发更新。

于 2013-09-27T08:37:16.680 回答