在休眠中合并后阻止刷新

时间:2016-03-23 12:30:15

标签: java hibernate jpa

1.我有一个具有惰性关联的复杂实体。我将它加载到我的@Viewscoped bean中的属性(它被分离)。

2.我更改了实体中的某些字段(仍然已分离)。

3.现在我需要来自我的实体的懒惰对象,所以我将实体合并到持久化上下文并初始化惰性对象,如:

@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;
}

我需要合并实体,以便我可以加载延迟关联(我需要活动的hibernate会话)但我不希望将我的实体中的更改保存到数据库中。这就是为什么在事务结束之前我将它从持久化上下文中分离出来。它有帮助吗?

当事务完成时,我不希望myEntity上有任何SQL UPDATES,我猜hibernate会在合并后准备对象更新,那么分离对象是否会阻止hibernate在事务结束前触发更新?合并期间可以调用刷新吗?

1 个答案:

答案 0 :(得分:3)

merge永远不会触发任何隐式flush。刷新仅在以下三种情况下发生:

  1. 在Hibernate断定执行的查询可能正在处理数据库中的陈旧数据的情况下,在查询执行(HQL / JPQL和本机查询)之前。
  2. 明确调用flush时。
  3. 提交交易时。
  4. 如果你想绝对确定不会发生任何刷新(当然,除非你明确地调用它),将刷新模式设置为manual

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

    JPA刷新模式不支持手动选项,这就是必须使用Hibernate原生Session API的原因。

    这样一来,你不需要在合并后清除持久化上下文,也不会刷新任何更改。