如何手动提交托管事务

vz0*_*vz0 6 java hibernate seam transactions jta

我得到了一个JAR形式的"API",可以从我的Java-Seam-Hibernate应用程序中执行一些外部会计操作.

在内部,API是一个简单的Hibernate应用程序,除了Seam本身使用的数据源外,还使用两个独立的数据源.

问题是,在执行内部.commit()时,其中一个"API"操作会引发以下异常:

java.sql.SQLException: You cannot commit during a managed transaction!
    at org.jboss.resource.adapter.jdbc.BaseWrapperManagedConnection.jdbcCommit(BaseWrapperManagedConnection.java:543)
    at org.jboss.resource.adapter.jdbc.WrappedConnection.commit(WrappedConnection.java:334)
    at org.hibernate.transaction.JDBCTransaction.commitAndResetAutoCommit(JDBCTransaction.java:139)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:115)
    at com.other.APIAccountingImpl.moneyMovement(APIAccountingImpl.java:261)
    at com.myapp.integration.ExternalApiIntegrator.storeAcountingData(ExternalApiIntegrator.java:125)
    at com.myapp.session.EmployeeAccounting.persistData(EmployeeAccounting.java:123)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at ...
Run Code Online (Sandbox Code Playgroud)

moneyMovement方法的源代码看起来像标准的Hibernate Session事务习惯用法:

Session sess = factory.openSession();
Transaction tx;
try {
    tx = sess.beginTransaction();
    //do some work
    ...
    tx.commit();
}
catch (Exception e) {
    if (tx!=null) tx.rollback();
    throw e;
}
finally {
    sess.close();
}
Run Code Online (Sandbox Code Playgroud)

我正在使用JAM的Seam托管交易.我也被迫使用自定义API,我不允许改变源代码.

我有什么选择?如何从"API"Hibernate会话中隔离Seam管理的事务?是否可以将特定数据源的连接配置为托管trx?

jpk*_*ing 3

您可能正在使用 JTA,它是用于事务管理的 Java EE 标准。在这种情况下,您使用的是托管事务。这意味着容器(看起来是 JBoss)正在处理事务边界,并且将使用 JTA 语义来回滚事务,以防抛出一些异常。在这种情况下,您不直接处理事务 API。如果发生错误,您只需抛出一些异常,它就会负责回滚事务的其他部分。

也就是说,我建议您确认您收到的这个 JAR 是 JTA api。如果不是,那么您肯定需要它的文档。如果是,您可以使用事务 API(和注释)来使用事务的显式划分。(一些文档可以在这里找到:http://download.oracle.com/javaee/5/tutorial/doc/bnciy.html#bnciz

总的来说,我想说让容器管理您的事务通常是一个好主意,因为事务通常在业务方法的上下文中,这可能涉及两个或多个 DAO 调用,因此,存在于您想要的事务之外每个 DAO 方法里面都有。