java - 防止 hibernate 合并后刷新

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

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

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

最佳答案

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

  1. 在查询执行之前(HQL/JPQL 和 native 查询),如果 Hibernate 断定所执行的查询可能正在使用数据库中的陈旧数据。
  2. 当显式调用 flush 时。
  3. 提交事务时。

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

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

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

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

关于java - 防止 hibernate 合并后刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36178254/

相关文章:

java - 如何高效使用PreparedStatement?

java - 获取 jasper 异常

没有公共(public)类的java文件

java - 在 Wildfly 中重新部署 war 时出现 ClassCastingException

java - Spring Boot 项目上的 Hibernate SessionFactory 注入(inject)不起作用

java - hibernate与Mysql的连接

java - GAE : How is it possible to access data/files that are stored in the GAE Blobstore by an external Web Service that is not deployed on GAE using Java

java - 插入子表时外键显示为空,错误无法将值 NULL 插入列中

java - hibernate 。优化 sqlRestriction

java - @OneToOne注解问题(我觉得。。。)