【问题标题】:Using USYNCHRONIZED persistence context with Hibernate 5.x and Wildlfy在 Hibernate 5.x 和 Wildfly 中使用 SYNCHRONIZED 持久性上下文
【发布时间】: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


    【解决方案1】:

    由于同步类型确实传播到注入的 enntiyManager,我意识到我可以使用 EntityManagerFactory 来创建 entityManger。工厂有一个接受同步类型的方法,因此它将创建非同步上下文。

    @PersistenceUnit
    private EntityManagerFactory emf;
    ...
    emf.createEntityManager(SynchronizationType.UNSYNCHRONIZED);
    

    另外,我发现这个问题记录在 WildFly 8.1 https://issues.jboss.org/browse/WFLY-5006

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-24
      • 2020-03-09
      • 1970-01-01
      • 2013-10-31
      • 2021-05-22
      相关资源
      最近更新 更多