当前位置: 首页 > 知识库问答 >
问题:

JPA(Hibernate)、JTA(JOTM)和Tomcat

司空坚
2023-03-14

我正在开发一个以JPA(Hibernate)为后端的应用程序。我对每个实体都有一个DAO和JPADAO,我的流程将不止一个实体作为一个工作单元进行更新,所以我决定使用JTA,因为它允许我控制事务,所以我的代码看起来是持久的。xml

    <persistence-unit name="Pub" transaction-type="JTA">
      <provider>org.hibernate.ejb.HibernatePersistence</provider>
       <jta-data-source>java:comp/env/jdbc/dcapps</jta-data-source>

     <property name="hibernate.dialect" value="org.hibernate.dialect.InformixDialect"/>
        <property name="transactionSynchronizationRegistryName" value="java:comp/env/TransactionSynchronizationRegistry"/>
        <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JOTMJtaPlatform"/>


            web.xml
      <resource-ref>
  <description>DB Connection</description>
  <res-ref-name>jdbc/dcapps</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
<resource-env-ref>
<description>JTA transaction manager</description>
<resource-env-ref-name>jta/UserTransaction</resource-env-ref-name>
<resource-env-ref-type>javax.transaction.UserTransaction</resource-env-ref-type>
</resource-env-ref>

    <resource-env-ref>
<description>JTA Transaction Synchronization Registry</description>
<resource-env-ref-name>TransactionSynchronizationRegistry</resource-env-ref-name>
<resource-env-ref-type>javax.transaction.TransactionSynchronizationRegistry
 </resource-env-ref-type>
 </resource-env-ref>


         content.xml(Tomcat 7)
        <Resource name="jdbc/dcapps" auth="Container" type="javax.sql.DataSource"
               maxActive="20" maxIdle="10" maxWait="-1"
               username="dcapps" password="dcapps" driverClassName="com.informix.jdbc.IfxDriver"
               url="jdbc:informix-sqli://fddb.fd.gtwy.dcn:7101/fd_test:INFORMIXSERVER=fd_ecf"/>

 <Resource
        name="TransactionSynchronizationRegistry"
        auth="Container"
        type="javax.transaction.TransactionSynchronizationRegistry"
        factory="org.objectweb.jotm.TransactionSynchronizationRegistryFactory"/>

<Transaction
        factory="org.objectweb.jotm.UserTransactionFactory"
        jotm.timeout="60"/>





        Process.java
       Context initContext = new InitialContext();
     utx  = (UserTransaction)initContext.lookup("java:comp/UserTransaction");
             dktPartDAO.getEntityManager().joinTransaction();
            dkttextDAO.getEntityManager().joinTransaction();
            reqHDAO.getEntityManager().joinTransaction();
            reqDDAO.getEntityManager().joinTransaction();
            costDAO.getEntityManager().joinTransaction();
            reportDDAO.getEntityManager().joinTransaction();
            caseflagDAO.getEntityManager().joinTransaction();
            redStatusDAO.getEntityManager().joinTransaction();
            pcdktPartDAO.getEntityManager().joinTransaction();
            pcDkttextDAO.getEntityManager().joinTransaction();
                           utx.commit();

现在,当我尝试开始一个事务并将更改提交给实体(不止一个)时,它会抛出和异常,并调用utx。回滚但不会回滚它只提交了部分事务,并没有保存所有实体

         Exception
      java.lang.IllegalStateException: Cannot get Transaction for rollback
at org.objectweb.jotm.Current.rollback(Current.java:486)
at pub.jpa.dto.support.PubDProcess.processRecords(PubDProcess.java:397)

         org.omg.CORBA.BAD_INV_ORDER: The Servant has not been associated with an ORB instance  vmcid: 0x0  minor code: 0  completed: No
at org.omg.PortableServer.Servant._get_delegate(Unknown Source)
at org.omg.PortableServer.Servant._poa(Unknown Source)
at org.objectweb.jotm._SubCoordinator_Tie.deactivate(Unknown Source)
at com.sun.corba.se.impl.javax.rmi.CORBA.Util.cleanUpTie(Unknown Source)
at com.sun.corba.se.impl.javax.rmi.CORBA.Util.unexportObject(Unknown Source)
at javax.rmi.CORBA.Util.unexportObject(Unknown Source)
at com.sun.corba.se.impl.javax.rmi.PortableRemoteObject.unexportObject(Unknown Source)
at javax.rmi.PortableRemoteObject.unexportObject(Unknown Source)

共有1个答案

贡烨烁
2023-03-14

您没有提到您使用的是哪个版本的JOTM,但我在使用v2时遇到了完全相同的问题。2.1. 降级到v2版本。1.9为我解决了这个问题。

显然最近已经修好了,看到了吗http://websvn.ow2.org/comp.php?repname=jotm

致以亲切的问候,

巴里

 类似资料:
  • JOTM (Java Open Transaction Manager)是一个独立的开源事务管理器,它实现了 XA 协议并且与 JTA API 兼容。当您使用独立 Tomcat 或 Jetty 容器,或者使用需要事务支持的独立应用程序时,它非常有用。

  • 问题内容: 我试图将hibernate实体管理器与mysql和glassfish一起使用。尝试使用JTA数据源时出现以下错误: 这是我配置persistence.xml的方法 但是,当我配置非jta数据源时,它可以正常工作 很好,但是我真的很想使用: 代替: 我是否在hibernate配置中缺少某些东西,或者甚至可以使用JTA数据源? 问题答案: 在您的配置中,默认情况下使用容器管理的事务。在这种

  • 问题内容: 我正在阅读使用Spring框架进行的事务管理。在第一个组合中,我使用了Spring + hiberante,并使用了Hibernate的API来控制事务(Hibenate API)。接下来,我想使用注释进行测试,它确实起作用。 我对此感到困惑: JPA,JTA,Hibernate是否具有它们自己的事务管理方式。例如,考虑如果我使用Spring + Hibernate,在那种情况下您会使

  • 问题内容: 我想集成 Spring 和 Hibernate, 并使用 JTA 来管理事务。我还想将事务处理委托给App服务器,在我的例子中是JBoss。我有一个关于Spring中“ transactionManager ” bean 的配置的查询: 1)我们可以使用 HibernateTransactionManager 并在hibernate.properties文件中设置属性 hibernat

  • 我正在使用Adobe Experience Manager(AEM)6.4和Service Pack 1以及表单包。我有很多扩展属性,所以我做了一个数据库图。我不想在crx中保存所有其他内容,我想将其保存在Oracle数据库中。 数据库图很复杂,所以我想至少使用JPA(Hibernate)。如果Spring能让它更容易使用,那对我来说就没问题了。 我读了很多关于OSGI使用蓝图而不是Spring的

  • Spring Data JPA不是一个JPA实现,它是对数据库数据访问的抽象。我不能理解这种表达方式与JPA的实现(比如Hibernate)进行比较。在使用Spring Data JPA时,要使用CRUD操作,必须从CrudRepository接口进行扩展。但是没有Hibernate,Spring Data JPA无法独立工作,因为它无法将java对象转换为实体。但是!Hibernate还可以执行