2016-03-23 62 views
2

1.我有一个复杂的实体和惰性关联。我将它加载到我的@Viewscoped bean(它是分离的)中的一个属性。禁止在休眠时合并冲洗

2.我改变实体中的一些字段(仍然分离)。

3.Now我需要从我的实体懒惰的对象,所以我合并的持久化上下文和初始化喜欢偷懒对象的实体:

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
public MyEntity loadTheLazyObjects(MyEntity myEntity){ 
    //at the beginning myEntity is detached 
myEntity = entityManager.merge(myEntity) //it is managed now 
myEntity.getSomeLazyCollection.size(); //initialize lazy collection 
entityManager.clear(); //myEntity is detached again 
return myEntity; 
} 

我需要合并的实体,所以我可以加载懒协会(我需要积极的休眠会议),但我不希望我的实体中的更改被保存到数据库。这就是为什么在事务结束之前,我将它从持久化上下文中分离出来。它会有帮助吗?

我不想在事务完成时在myEntity上进行任何SQL更新,并且我猜hibernate会在合并后准备更新对象,因此分离对象会阻止hibernate在事务结束之前触发更新吗?合并期间可以调用flush吗?

+1

你可能会争辩说,因为对象是以这种方式加载的,所以你可以创建一个单独的查询来检索它们。 我不知道如何不使用合并更新实体。 –

+0

合并的目的是合并。如果你需要某种组合的对象。从数据库加载责任对象并自行合并它们。 F.E. ModelMapper –

+0

而不是'merge()',你可以'em.find()'相应的实体(它将被管理直到'em.clear()')并从那里取得一个集合。 –

回答

3

merge将永远不会触发任何暗示flush。法拉盛只发生在如下三种情况:

  1. 在案件执行查询(HQL/JPQL和原生查询)当Hibernate的结论是所执行的查询可以与数据库中的陈旧数据进行工作之前。
  2. flush被明确调用。
  3. 交易提交时。

如果你想绝对保证不会出现潮红(除非你明确地调用它,当然),设置冲洗模式为manual

entityManager.unwrap(Session.class).setFlushMode(FlushMode.MANUAL); 

JPA洗净模式不支持手动选项,这就是为什么必须使用Hibernate native Session API。

这样你就不需要在合并后清除持久化上下文,反正也不会改变刷新。