【发布时间】:2016-08-09 01:06:16
【问题描述】:
我正在尝试将使用非同步持久性上下文和 JTA 事务的应用程序从 hibernate 4.3.7 迁移到 Hibernate 5.0.7,但我发现了一些我无法理解的问题。我们的实体管理器注入为
@PersistenceContext(type = PersistenceContextType.EXTENDED, synchronization = SynchronizationType.UNSYNCHRONIZED)
private EntityManager entityManager;
所以我希望有扩展和不同步的持久性上下文。应用程序使用 UNSYNCHRONIZED 特性来避免将实体的更改刷新到数据库,直到我们想要这样做。通常,我们只想在保存/持久/删除操作和这些方法调用 entityManager.joinTransaction(); 之后刷新更改
显式标记当前事务以进行同步。这用于在 Hibernate 4.3.7 中在一定程度上工作,但在版本 5 中停止。
对于第 5 版,Hiberante 人员进行了大量的重写,尤其是在事务处理方面。据我了解,hibernate 使用 session.autoJoinTransactions 标志来实现 UNSYNCHRONIZED 功能。除非会话加入事务,否则会话不会被刷新(我们使用默认的 flushMode.AUTO)。以前,此标志将为新会话设置为
sessionBuilder.autoJoinTransactions( getTransactionType() != PersistenceUnitTransactionType.JTA );
在休眠 5 中(EntityManagetImpl 第 132 行)
sessionBuilder.autoJoinTransactions( getSynchronizationType() == SynchronizationType.SYNCHRONIZED );
当我们使用 JTA 托管事务时,它曾经可以工作。但现在没有了。似乎根据 SynchronizationType 确定 autoJoinTransactionflag 的值是正确的做法,但有一个小问题。 persistenceContextTyoe 不会传播到 EntityFactoryImpl 方法,因此实体管理器始终创建为同步的。当注入 entityManager 时,wildlfy 调用第一个方法而不是第二个方法。
@Override
public EntityManager createEntityManager(Map map) {
return internalCreateEntityManager( SynchronizationType.SYNCHRONIZED, map );
}
@Override
public EntityManager createEntityManager(SynchronizationType synchronizationType, Map map) {
errorIfResourceLocalDueToExplicitSynchronizationType();
return internalCreateEntityManager( synchronizationType, map );
}
所以我的问题是:如何注入具有非同步持久性上下文的实体管理器实例? 为什么Wildfly 在注入实体管理器时忽略type = PersistenceContextType.EXTENDED 参数?我错过了什么吗?
【问题讨论】:
标签: hibernate jpa wildfly-8 wildfly-9 hibernate-5.x