Comment manuellement commettre un géré la transaction
M'a donné une "API" sous la forme d'un POT pour faire quelques externes des opérations de la comptabilité de mon Java-Couture-Hibernate montage de dossier.
En interne, l'API est une plaine d'applications Hibernate, à l'aide de deux sources de données en plus de celui utilisé à partir de la Couture de lui-même.
Le problème est que l'un des "API" opérations soulève l'Exception suivante, lorsqu'il fait un interne .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 ...
Le code source de la moneyMovement méthode ressemble à la norme Session Hibernate transaction idiome:
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();
}
Je suis l'aide de Couture géré transactions avec JTA. Je suis aussi obligé d'utiliser l'API et je ne suis pas autorisé à modifier le code source.
Quelles sont mes options? Comment puis-je isoler la Couture géré les transactions de la "API" Session Hibernate? Il est possible de configurer une connexion à partir d'une source de données spécifique pour ne pas être géré trx?
Vous devez vous connecter pour publier un commentaire.
Vous êtes probablement à l'aide de JTA, qui est un Java EE standard pour la gestion des transactions. Dans ce cas, vous utilisez un géré la transaction. Cela signifie que le conteneur (JBoss, paraît-il) est chargé de la transaction limites, et d'utiliser la JTA sémantique d'annuler la transaction dans le cas où vous jetez quelques exception. Dans ce scénario, vous ne travaillez pas avec l'API transaction directement. Vous venez de lancer une exception dans le cas où quelque chose se passe mal, et il prendra soin de faire reculer les autres parties de la transaction.
Cela dit, je vous recommande de confirmer que ce POT que vous avez reçu l'api JTA. Si elle ne l'est pas, alors vous aurez certainement besoin de la documentation. Si elle l'est, vous pouvez utiliser la transaction API (et annotations) pour l'utilisation explicite de démarcation des transactions. (une partie de la documentation est disponible ici: http://download.oracle.com/javaee/5/tutorial/doc/bnciy.html#bnciz)
Dans l'ensemble, je dirais que c'est généralement une bonne idée de laisser le conteneur de gérer vos transactions, comme une transaction est généralement dans le contexte d'une méthode d'affaires, ce qui peut impliquer deux ou plusieurs DAO appels, ainsi, existant au-delà de la transaction que vous auriez à l'intérieur de chaque méthode DAO.
Si vous voulez les 2 opérations à être lié, il pourrait être possible de coucher avec hibernate config de sorte que l'opération de l'instance est celle qui vous a le contrôle. vous pouvez donc donner à la sous-tendent le code hibernate est un mannequin de transaction qui ne fait rien et laisse couture de contrôle de la transaction immobilière.
Alternativement, si vous ne voulez pas les 2 opérations liées, vous pouvez sans doute l'appel de l'API à partir d'un ejb méthode avec un attribut de transaction "non pris en charge" (pas super clair sur la façon de Couture œuvres, mais en supposant que c'est ejb sous le capot). ce serait séparée de l'API transaction à partir du courant de la Couture de la transaction.