如何解决使用Hibernate多租户时不会提交JTA事务
该问题已发布在Hibernate论坛上,没有好的解决方案。希望在这里获得更多知名度: https://discourse.hibernate.org/t/transactions-not-committed-when-using-multi-tenancy/2750
我们正在使用具有多租户的Wildfly 18,并使用每个租户策略的数据库。 数据源是使用commons-dbcp2动态创建的,未在Wildfly XML文件中配置。 由于各种原因,我们无法通过典型的Wildfly配置来配置数据源。
应用程序使用带有@Transactional
注释的bean
问题: Wildfly / Hibernate从不对成功的事务调用commit。 如果我们将连接设置为autoCommit = false,则永远不会提交它们。 如果将它们设置为autoCommit = true,则永远不会回滚。
黑客: 我们必须创建一个自定义的拦截器来提交事务。希望有一种更清洁的方法。
相关的persistence.xml:
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">
<persistence-unit name="default" transaction-type="JTA">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<properties>
<property name="hibernate.multiTenancy" value="DATABASE" />
<property name="hibernate.multi_tenant_connection_provider" value="com.blah.DeploymentIdConnectionProviderImpl" />
<property name="hibernate.tenant_identifier_resolver" value="com.blah.DeploymentIdIdentifierResolverImpl" />
<property name="hibernate.connection.provider_disables_autocommit" value="true"/>
<property name="hibernate.connection.handling_mode" value="DELAYED_ACQUISITION_AND_RELEASE_AFTER_TRANSACTION"/>
<property name="hibernate.session_factory.session_scoped_interceptor" value="com.blah.TransactionInterceptor"/>
<property name="jboss.entity.manager.factory.jndi.name" value="java:jboss/EntityManagerFactory"/>
<property name="jboss.entity.manager.jndi.name" value="java:jboss/EntityManager"/>
</properties>
</persistence-unit>
</persistence>
public class TransactionInterceptor extends EmptyInterceptor {
@Override
public void beforeTransactionCompletion(Transaction tx) {
EntityManager entityManager = // lookup from JNDI
Session session = entityManager.unwrap(Session.class);
if (entityManager.isJoinedToTransaction()) {
session.flush();
session.doWork(Connection::commit);
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。