NamingException:jta.UserTransaction

时间:2014-10-01 03:29:56

标签: java hibernate jpa transactions jta

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

  

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

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

<session-factory>
    <property name="show_sql">true</property>
    <property name="connection.datasource">java:comp/env/myDataSource</property>
    <property name="jta.UserTransaction">java:comp/UserTransaction</property>
    <property name="transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property>

在应用的web.xml中,UserTransaction设置在<resource-env-ref>

<resource-env-ref>
    <description>Object factory for MyBean instances.</description>
    <resource-env-ref-name>UserTransaction</resource-env-ref-name>
    <resource-env-ref-type>javax.transaction.UserTransaction</resource-env-ref-type>
</resource-env-ref>

在代码中,我尝试用{strong> JNDI 名称

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

但是返回以下异常:

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服务器移植到Apache Tomcat,该服务器正在运行noramlly;话虽如此 - 我是否需要在context.xml中定义 UserTransaction ,以便getTransactionContext()找到它?如果没有,我如何在我的代码中适当地返回UserTransaction?

1 个答案:

答案 0 :(得分:3)

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

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

我建议您浏览following article。您可以使用BitronixAtomikos,并且需要在Tomcat context.xml中设置UserTransaction和TransactionSyncronizationRegistry。