【问题标题】:prevent flushing after merge in hibernate防止在休眠中合并后刷新
【发布时间】:2016-03-23 12:30:14
【问题描述】:

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

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

我不希望在事务完成时对 myEntity 进行任何 SQL 更新,我猜 hibernate 会在合并后准备要更新的对象,那么分离对象是否会阻止 hibernate 在事务结束之前触发更新?合并过程中可以调用flush吗?

【问题讨论】:

  • 您可能会争辩说,由于对象是以这种方式延迟加载的,您不妨创建一个单独的查询来检索它们。我不知道如何不使用合并更新实体。
  • 合并的目的是为了合并。如果您需要某种组合对象。从数据库中加载负责的对象并自行合并它们。 f.e.模型映射器
  • 代替merge(),你可以em.find()对应的实体(直到em.clear())并从那里取一个集合。
  • 我会这样做的。谢谢你的回答。

标签: java hibernate jpa


【解决方案1】:

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

  1. 在 Hibernate 断定执行的查询可能正在处理数据库中的陈旧数据的情况下执行查询(HQL/JPQL 和本机查询)之前。
  2. flush 被显式调用时。
  3. 提交事务时。

如果您想绝对确定不会发生刷新(当然,除非您明确调用它),请将刷新模式设置为 manual

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

JPA 刷新模式不支持手动选项,所以必须使用 Hibernate 原生 Session API。

这样你合并后不需要清除持久化上下文,无论如何都不会刷新任何更改。

【讨论】:

    猜你喜欢
    • 2018-11-27
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多