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;
}
我需要合并实体,以便可以加载惰性关联(我需要 Activity 的 hibernate session ),但我不希望将实体中的更改保存到数据库中。这就是为什么在事务结束之前我将其与持久性上下文分离。有帮助吗?
当事务完成时,我不希望在 myEntity 上进行任何 SQL 更新,并且我猜想 hibernate 将在合并后准备要更新的对象,那么分离对象是否会阻止 hibernate 在事务结束之前触发更新?合并时可以调用flush吗?
最佳答案
merge
永远不会触发任何隐式的flush
。冲洗仅发生在以下三种情况:
- 在查询执行之前(HQL/JPQL 和 native 查询),如果 Hibernate 断定所执行的查询可能正在使用数据库中的陈旧数据。
- 当显式调用
flush
时。 - 提交事务时。
如果您想绝对确保不会发生刷新(当然,除非您显式调用它),请将刷新模式设置为 manual :
entityManager.unwrap(Session.class).setFlushMode(FlushMode.MANUAL);
JPA 刷新模式不支持手动选项,这就是必须使用 Hibernate 原生 Session
API 的原因。
这样您就不需要在合并后清除持久性上下文,无论如何都不会刷新任何更改。
关于java - 防止 hibernate 合并后刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36178254/