From: <hib...@li...> - 2006-03-15 02:34:41
|
Author: bi...@jb... Date: 2006-03-14 21:33:54 -0500 (Tue, 14 Mar 2006) New Revision: 9624 Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/transaction/JoinableJTATransaction.java trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/transaction/JoinableJTATransactionFactory.java Log: clear JoinStatus at end of transaction and also when checking if within TX, also check the *REAL* JTA transaction Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java 2006-03-15 01:00:50 UTC (rev 9623) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java 2006-03-15 02:33:54 UTC (rev 9624) @@ -332,7 +332,8 @@ //set the joined status if (transactionType == PersistenceUnitTransactionType.JTA) { final Session session = getSession(); - JoinableJTATransaction joinableJTATransaction = (JoinableJTATransaction) session.getTransaction(); + final JoinableJTATransaction joinableJTATransaction = (JoinableJTATransaction) session.getTransaction(); + //register the clear on rollback if (joinableJTATransaction.getStatus() == JoinableJTATransaction.JoinStatus.JOINED) return; //no-op joinableJTATransaction.markForJoined(); session.isOpen(); //register to the Tx @@ -342,8 +343,7 @@ else if (joinableJTATransaction.getStatus() == JoinableJTATransaction.JoinStatus.MARKED_FOR_JOINED) { throw new AssertionFailure( "Transaction MARKED_FOR_JOINED after isOpen() call" ); } - //register the clear on rollback - joinableJTATransaction.registerSynchronization( new Synchronization() { + joinableJTATransaction.registerSynchronization( new Synchronization() { public void beforeCompletion() { } @@ -355,7 +355,9 @@ session.clear(); } } - } + JoinableJTATransaction joinable = (JoinableJTATransaction) session.getTransaction(); + joinable.resetStatus(); + } } ); } Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/transaction/JoinableJTATransaction.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/transaction/JoinableJTATransaction.java 2006-03-15 01:00:50 UTC (rev 9623) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/transaction/JoinableJTATransaction.java 2006-03-15 02:33:54 UTC (rev 9624) @@ -3,6 +3,7 @@ import javax.naming.InitialContext; import javax.transaction.SystemException; +import javax.transaction.UserTransaction; import org.hibernate.HibernateException; import org.hibernate.TransactionException; @@ -31,7 +32,8 @@ void tryJoiningTransaction() { if (status == JoinStatus.MARKED_FOR_JOINED) { try { - if ( getUserTransaction() != null && JTAHelper.isInProgress( getUserTransaction().getStatus() ) ) { + UserTransaction ut = getUserTransaction(); + if ( getUserTransaction() != null && JTAHelper.isInProgress( getUserTransaction().getStatus() ) ) { status = JoinStatus.JOINED; } else { @@ -54,7 +56,9 @@ return status; } - public void markForJoined() { + public void resetStatus() { status = JoinStatus.NOT_JOINED; } + + public void markForJoined() { if (status != JoinStatus.JOINED) status = JoinStatus.MARKED_FOR_JOINED; } Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/transaction/JoinableJTATransactionFactory.java =================================================================== --- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/transaction/JoinableJTATransactionFactory.java 2006-03-15 01:00:50 UTC (rev 9623) +++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/transaction/JoinableJTATransactionFactory.java 2006-03-15 02:33:54 UTC (rev 9624) @@ -22,7 +22,8 @@ public boolean isTransactionInProgress( JDBCContext jdbcContext, Context transactionContext, Transaction transaction ) { - if (transaction == null) return false; //should not happen though + if (!super.isTransactionInProgress(jdbcContext, transactionContext, transaction)) return false; + if (transaction == null) return false; //should not happen though JoinableJTATransaction joinableJTATransaction = ( (JoinableJTATransaction) transaction ); joinableJTATransaction.tryJoiningTransaction(); return joinableJTATransaction.getStatus() == JoinableJTATransaction.JoinStatus.JOINED; |