NamingException:jta.UserTransaction

我有一个直接使用Java Transaction API资源的hibernate应用程序。 我正在尝试使用UserTransaction来完成一些基本的数据库事务

UserTransaction接口定义允许应用程序显式管理事务边界的方法

在hibernate.cfg.xml文件中,我有以下属性:

 true java:comp/env/myDataSource java:comp/UserTransaction org.hibernate.transaction.JTATransactionFactory 

在应用程序的web.xml中,UserTransaction在

  Object factory for MyBean instances. UserTransaction javax.transaction.UserTransaction  

在代码中,我尝试使用InitialContext以其JNDI名称查找UserTransaction

 public UserTransaction getTransactionContext() throws Exception { if (this.ut == null) { ut = (UserTransaction)new InitialContext().lookup("java:comp/UserTransaction"); } return ut; } 

但是返回以下exception:

 03:27:37,530 ERROR [someServlet:555] Error in someMethod javax.naming.NamingException: Cannot create resource instance at org.apache.naming.factory.ResourceEnvFactory.getObjectInstance(ResourceEnvFactory.java:117) at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:321) at org.apache.naming.NamingContext.lookup(NamingContext.java:843) at org.apache.naming.NamingContext.lookup(NamingContext.java:154) at org.apache.naming.NamingContext.lookup(NamingContext.java:831) at org.apache.naming.NamingContext.lookup(NamingContext.java:154) at org.apache.naming.NamingContext.lookup(NamingContext.java:831) at org.apache.naming.NamingContext.lookup(NamingContext.java:168) at org.apache.naming.SelectorContext.lookup(SelectorContext.java:158) 

这个应用程序从一个Weblogic服务器移植到那里,它正在运行noramlly到Apache Tomcat; 话虽如此 – 我是否需要在context.xml中定义UserTransaction以便getTransactionContext()找到它? 如果没有,我如何在我的代码中适当地返回UserTransaction?

将应用程序从完整的Java EE应用程序服务器移植到Tomcat(Web应用程序服务器)需要一些额外的步骤。

所有Java EE AS都附带一个JTA事务管理器,它们的事务引擎管理事务绑定和事务解析,就像UserTransaction JNDI上下文一样。

我建议你阅读以下文章 。 您可以使用Bitronix或Atomikos ,并且需要在Tomcat context.xml中设置UserTransaction和TransactionSyncronizationRegistry。