Tôi đã nhận được một "API" dưới dạng một JAR để thực hiện một số hoạt động kế toán bên ngoài từ ứng dụng Java-Seam-Hibernate của tôi.Cách thực hiện giao dịch được quản lý theo cách thủ công
Nội bộ, API là một ứng dụng Hibernate đơn giản, sử dụng hai nguồn dữ liệu độc lập ngoài nguồn được sử dụng từ chính Seam.
Vấn đề là một trong những hoạt động "API" làm tăng ngoại lệ sau khi thực hiện một .commit nội bộ():
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 ...
Mã nguồn của phương pháp moneyMovement trông giống như tiêu chuẩn 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();
}
Tôi đang sử dụng giao dịch được quản lý Seam với JTA. Tôi cũng buộc phải sử dụng API tùy chỉnh và tôi không được phép thay đổi mã nguồn.
Lựa chọn thay thế của tôi là gì? Làm thế nào tôi có thể cô lập các giao dịch quản lý Seam từ phiên "Hibernate" API? Có thể cấu hình kết nối từ một nguồn dữ liệu cụ thể để không phải là một trx được quản lý?