java - 命名异常 : jta. 用户事务

标签 java hibernate jpa transactions jta

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

The UserTransaction interface defines the methods that allow an application to explicitly manage transaction boundaries

在 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>

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

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;话虽如此 - 我是否需要在我的 context.xml 中定义 UserTransaction为了 getTransactionContext()找到它?如果不是,我如何在代码中正确返回 UserTransaction?

最佳答案

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

所有 Java EE 服务器都带有 JTA 事务管理器,其事务引擎管理事务绑定(bind)和事务解析,如 UserTransaction JNDI 上下文。

您可以使用BitronixAtomikos ,并且需要在 Tomcat context.xml 中设置 UserTransaction 和 TransactionSyncronizationRegistry。

关于java - 命名异常 : jta. 用户事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26133663/

相关文章:

mysql - 如何在数据库中执行一对一关系插入

java - Hibernate 5 是否支持基于 XML 的实体映射?

java - 如何将nativeQuery列表转换为jpa查询列表?

java - IDEA 显示正在使用的方法,未使用时

java - 在android数据库中存储 float

hibernate - 2 个一对多而不是 1 个多对多

java - jpa中如何实现自增

java - java中的方法参数

java - 编程新手,Java.lang.NullPointerException 与 ArrayList

java - 如何统计HQL中的子查询?