将narayana事务管理器与hibernate集成

时间:2016-09-29 15:08:44

标签: hibernate jboss transactions jta

我的独立应用程序已经使用narayana事务管理器与其他XA资源进行JTA事务,现在我也尝试将它与Hiberante集成。因此,hibernate事务也在JTA transcation范围内执行 -

的hibernate.cfg.xml

 <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
 <property name="hibernate.transaction.factory_class">
  org.hibernate.transaction.JTATransactionFactory</property>

<property name="hibernate.transaction.manager_lookup_class">
   <!-- org.hibernate.transaction.JBossTransactionManagerLookup -->com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionManagerImple
</property>

<property name="hibernate.current_session_context_class">jta</property>

其他java conf -

registry.applySetting(AvailableSettings.JTA_PLATFORM,     "org.hibernate.service.jta.platform.internal.JBossStandAloneJtaPlatform");

registry.applySetting(AvailableSettings.TRANSACTION_COORDINATOR_STRATEGY,     "jta");

以下是我如何开始交易 -

TransactionManager transactionManager     =com.arjuna.ats.jta.TransactionManager.transactionManager();
transactionManager.begin();

Session session = currentSessionContext.currentSession();

session.joinTransaction();
System.out.println("is joined "+session.isJoinedToTransaction());

session.update(obj);
transactionManager.commit();
session.close();
sessionFactory.close();

现在问题是db只在调用sessionFactory.close()之后才显示会话的更改 但不应该在transactionManager.commit()。

如何配置它以在transactionManager.commit()之后进行db更新?

1 个答案:

答案 0 :(得分:0)

你很接近。缺少的是事务管理器的 JDBC 连接登记,请参阅 https://jbossts.blogspot.com/2017/12/narayana-jdbc-transactional-driver.html

这个额外的步骤是必要的,因为 Narayana 实现了 JTA 规范,并且 JTA 使用 XAResources 而不是 JDBC 连接。需要一些胶水代码 a) 为 JDBC 连接提供 XAResource b) 将该资源登记到事务