throw new AssertionFailure( "Transaction MARKED_FOR_JOINED after isOpen() call" );
}
//flush before completion and
//register clear on rollback
log.trace( "Adding flush() and close() synchronization" );
CallbackCoordinator callbackCoordinator = ( (SessionImplementor ) getSession() ).getJDBCContext().getJtaSynchronizationCallbackCoordinator();
if ( callbackCoordinator == null ) {
throw new AssertionFailure( "Expecting CallbackCoordinator to be non-null" );
}
callbackCoordinator.setBeforeCompletionManagedFlushChecker(
new BeforeCompletionManagedFlushChecker() {
public boolean shouldDoManagedFlush(TransactionFactory.Context ctx, javax.transaction.Transaction jtaTransaction)
throws SystemException {
if ( transaction == null ) {
log.warn( "Transaction not available on beforeCompletion: assuming valid" );
}
return !ctx.isFlushModeNever()
&& ( jtaTransaction == null || !JTAHelper.isRollback( jtaTransaction.getStatus() ) );
}
}
);
callbackCoordinator.setAfterCompletionAction(
new AfterCompletionAction() {
public void doAction(TransactionFactory.Context ctx, int status) {
try {
if ( !ctx.isClosed() ) {
if ( Status.STATUS_ROLLEDBACK == status
&& transactionType == PersistenceUnitTransactionType.JTA ) {
session.clear();
}
JoinableCMTTransaction joinable = ( JoinableCMTTransaction ) session.getTransaction();
joinable.resetStatus();
}
}
catch ( HibernateException e ) {
throw convert( e );
}
}
}
);
callbackCoordinator.setExceptionMapper(
new ExceptionMapper() {
public RuntimeException mapStatusCheckFailure(String message, SystemException systemException) {
throw new PersistenceException( message, systemException );
}