当前位置: 首页 > 知识库问答 >
问题:

在Hibernate 5.x和Wildlfy中使用USYNCHRONIZED持久化上下文

赵锐
2023-03-14

我正在尝试将使用JTA事务的非同步持久性上下文的应用程序从hibernate 4.3.7迁移到Hibernate 5.0.7,我发现了一些我无法解决的问题。我们的实体管理器注入为

@PersistenceContext(type = PersistenceContextType.EXTENDED, synchronization = SynchronizationType.UNSYNCHRONIZED)
private EntityManager entityManager;

所以我希望有扩展的和非同步的持久化上下文。应用程序使用非同步特性来避免将实体的更改刷新到数据库,直到我们想要这样做。通常,我们希望仅在保存/持久化/移除操作以及这些方法调用< code > entitymanager . joint transaction()之后刷新更改;将当前交易明确标记为同步。这在Hibernate 4.3.7中曾经在一定程度上起作用,但在版本5中停止了。

对于版本5,Hiberante的家伙们做了相当多的重写,特别是在事务处理领域。根据我的理解,Hibernate使用会话.auto加入交易标志来实现“未同步”功能。会话不会被刷新(我们使用默认的 flushMode.AUTO),除非会话已加入事务。以前,此标志将设置为新会话

sessionBuilder.autoJoinTransactions( getTransactionType() != PersistenceUnitTransactionType.JTA );

和Hibernate5(EntityManagetImpl第132行)

sessionBuilder.autoJoinTransactions( getSynchronizationType() == SynchronizationType.SYNCHRONIZED );

当我们使用JTA管理的事务时,它曾经起作用。但现在没有了。根据SynchronizationType决定autoJoinTransaction标志的值似乎是正确的,但有一个小问题。persistenceContextTyoe不会传播到EntityFactoryImpl方法,因此实体管理器始终创建为同步的。在注入entityManager时,会调用第一个方法而不是第二个方法。

@Override
    public EntityManager createEntityManager(Map map) {
        return internalCreateEntityManager( SynchronizationType.SYNCHRONIZED, map );
    }

    @Override
    public EntityManager createEntityManager(SynchronizationType synchronizationType, Map map) {
        errorIfResourceLocalDueToExplicitSynchronizationType();
        return internalCreateEntityManager( synchronizationType, map );
    }

所以我的问题:如何用不同步的持久化上下文注入实体管理器的实例?为什么< code>Wildfly会忽略< code > type = PersistenceContextType。注入实体管理器时的扩展参数?我错过了什么吗?

共有1个答案

戚育
2023-03-14

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

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

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

 类似资料:
  • 问题内容: 我有一个托管bean,其中包含当前页面的实体对象列表。在我创建一个新对象并在事务中使用persist()将其持久保存到数据库之后;在另一个事务中,当我调用merge时(由于该实体由于先前的事务提交而处于分离状态);实体管理器无法在持久性上下文中找到对象,并向数据库抛出选择查询。我是否缺少某些东西,或者是正常行为? 更新:当我使用mysql数据库和自动生成的ID列时,存在上述问题。当我在

  • 提前非常感谢您阅读此问题。 我正在使用: 并且在单点登录(@EnableOAuth2Sso)中使用(通过)时,会对Redis数据存储中的的持久性产生疑问,反向代理()网关。 在我看来,jdkdynamicaoproxied是在未正确保存在Redis数据存储中。 在不使用的情况下调试创建显示(如预期的那样),bean将在每个客户端会话中实例化一次,并存储在中。除了在Spring的。 但是,一旦使用了

  • 概述 本文由Daniel Messer(Technical Marketing Manager Storage @RedHat)和Keith Tenzer(Solutions Architect @RedHat)共同撰写。 Storage for Containers Overview – Part I Storage for Containers using Gluster – Part II

  • 问题内容: 我试图在spring启动时将JSON对象存储在MySQL数据库中。我知道我做错了事,但是我无法弄清楚到底是什么原因,因为我对Spring还很陌生。 我有一个休息端点,在这里我通过HTTP PUT获取以下JSON对象,并且需要将其存储在数据库中,以便用户以后可以通过HTTP GET获取它。 请注意,在上述情况下,对象 中* 键 的 数量 可能会有所不同,由于该要求,我正在使用a 来捕获控

  • Akka持久化使有状态的actor能留存其内部状态,以便在因JVM崩溃、监管者引起,或在集群中迁移导致的actor启动、重启时恢复它。Akka持久化背后的关键概念是持久化的只是一个actor的内部状态的的变化,而不是直接持久化其当前状态 (除了可选的快照)。这些更改永远只能被附加到存储,没什么是可变的,这使得高事务处理率和高效复制成为可能。有状态actor通过重放保存的变化来恢复,从而使它们可以重

  • 我想使用Hibernate(4.3.6 Final)持久化一个以基本类型为键、非实体可嵌入复合类型值为值的映射。 我没有任何问题的基本类型作为键和值,我做了所有的方式一样,这是好的。当我将map值更改为可嵌入复合类型时遇到了问题,如下所示。 但我得到了错误: 原因:com.mysql.jdbc.exceptions.jdbc4.mysqlSyntaxerrorexception:“field li