Мне было предоставлено «API» в форме JAR для выполнения некоторых внешних операций учета из моего приложения Java-Seam-Hibernate.Как вручную совершить управляемую транзакцию
Внутренне API представляет собой обычное приложение для спящего режима, используя два независимых источника данных, кроме одного, используемого самим швом.
Вопрос заключается в том, что одна из операций «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, с сеанса Hibernate «API»? Можно настроить соединение из определенного источника данных, чтобы не быть управляемым trx?