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在事务结束前触发更新?合并期间可以调用刷新吗?
答案 0 :(得分:3)
merge
永远不会触发任何隐式flush
。刷新仅在以下三种情况下发生:
flush
时。如果你想绝对确定不会发生任何刷新(当然,除非你明确地调用它),将刷新模式设置为manual:
entityManager.unwrap(Session.class).setFlushMode(FlushMode.MANUAL);
JPA刷新模式不支持手动选项,这就是必须使用Hibernate原生Session
API的原因。
这样一来,你不需要在合并后清除持久化上下文,也不会刷新任何更改。