我被給了一個JAR形式的「API」來從我的Java-Seam-Hibernate應用程序中執行一些外部計帳操作。如何手動提交管理的事務
在內部,API是一個普通的Hibernate應用程序,使用兩個獨立的數據源,除了Seam本身使用的數據源。
的問題是,「API」操作中的一個操作的方式的內部.commit()時引發以下例外:
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 ...
的moneyMovement方法的源代碼看起來像標準Hibernate Session transaction idiom:
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();
}
我使用Seam與JTA進行管理事務。我也被迫使用自定義API,我不允許修改源代碼。
我的替代品是什麼?如何將Seam管理事務從「API」Hibernate會話中分離出來?可以將特定數據源的連接配置爲不受託管的trx?