FileDocCategorySizeDatePackage
EntityTransactionImpl.javaAPI DocGlassfish v2 API8335Tue May 22 16:54:28 BST 2007oracle.toplink.essentials.internal.ejb.cmp3.transaction.base

EntityTransactionImpl

public class EntityTransactionImpl extends Object
INTERNAL: Base EntityTransactionImpl This is a thin wrapper around a UnitOfWork that implements functionality required by the EntityTransaction interface. The actual interface is implemented by two subclasses:
see
oracle.toplink.essentials.internal.ejb.cmp3.transaction.EntityTransactionImpl
see
oracle.toplink.essentials.internal.ejb.cmp3.transaction.jdk14.EntityTransactionImpl The EntityTransaction is a thin wrapper around a UnitOFWork.

Fields Summary
protected EntityTransactionWrapper
wrapper
protected boolean
active
protected boolean
rollbackOnly
Constructors Summary
public EntityTransactionImpl(EntityTransactionWrapper wrapper)


           
            this.wrapper = wrapper;
        
Methods Summary
public voidbegin()
Start the current transaction. This can only be invoked if {@link #isActive()} returns false.

throws
IllegalStateException if isActive() is true.

        if (isActive()){
          throw new IllegalStateException(TransactionException.transactionIsActive().getMessage());
        }
        if (this.wrapper.getEntityManager().isExtended()){
            // so we have a resource local extended em so get the PC from the entity manager
            this.wrapper.localUOW = this.wrapper.getEntityManager().getActivePersistenceContext(null);
            this.wrapper.localUOW.setShouldTerminateTransaction(false);
        }else{
            this.wrapper.localUOW = new RepeatableWriteUnitOfWork(this.wrapper.getEntityManager().getServerSession().acquireClientSession());
            this.wrapper.localUOW.setShouldTerminateTransaction(false);
            this.wrapper.localUOW.setShouldCascadeCloneToJoinedRelationship(true);
        }
        this.active = true;
      
public voidcommit()
Commit the current transaction, writing any un-flushed changes to the database. This can only be invoked if {@link #isActive()} returns true.

throws
IllegalStateException if isActive() is false.

        if (!isActive()){
          throw new IllegalStateException(TransactionException.transactionNotActive().getMessage());
        }
        try {
            if (this.wrapper.localUOW != null){
                this.wrapper.localUOW.setShouldTerminateTransaction(true);
                if (! this.rollbackOnly){
                    if (this.wrapper.localUOW.shouldResumeUnitOfWorkOnTransactionCompletion()){
                        this.wrapper.localUOW.commitAndResume();
                        return;
                    }else{
                      this.wrapper.localUOW.commit();
                      // all change sets and are cleared, but the cache is kept
                      this.wrapper.localUOW.clearForClose(false);
                    }
                } else {
                    throw new RollbackException(ExceptionLocalization.buildMessage("rollback_because_of_rollback_only"));
                }
            }
        }catch (RuntimeException ex){
            if (this.wrapper.localUOW != null){
                wrapper.getEntityManager().removeExtendedPersistenceContext();
                this.wrapper.localUOW.release();
                this.wrapper.localUOW.getParent().release();
            }
            if(! this.rollbackOnly) {
                throw new RollbackException(ex);
            } else {
                // it's a RollbackException
                throw ex;
            }
        } finally {
            this.active = false;
            this.rollbackOnly = false;
            wrapper.setLocalUnitOfWork(null);            
        }
      
protected voidfinalize()
Here incase a user does not commit or rollback an enityTransaction but just throws it away. If we do not rollback the txn the connection will go back into the pool.

        try{
            if (isActive())
                this.rollback();
        }finally{
            super.finalize();
        }
    
public booleangetRollbackOnly()
Determine whether the current transaction has been marked for rollback.

throws
IllegalStateException if isActive() is false.

        if (!isActive()){
            throw new IllegalStateException(TransactionException.transactionNotActive().getMessage());
        }
        return this.rollbackOnly;
    
public booleanisActive()
Check to see if the current transaction is in progress.

          return this.active;
      
public voidrollback()
Roll back the current transaction, discarding any changes that have happened in this transaction. This can only be invoked if {@link #isActive()} returns true.

throws
IllegalStateException if isActive() is false.

        if (!isActive()){
          throw new IllegalStateException(TransactionException.transactionNotActive().getMessage());
        }
        try{
            if (wrapper.getLocalUnitOfWork() != null){
                this.wrapper.localUOW.setShouldTerminateTransaction(true);
                this.wrapper.localUOW.release();
                this.wrapper.localUOW.getParent().release();
            }
        }finally{
            this.active = false;
            this.rollbackOnly = false;
            wrapper.getEntityManager().removeExtendedPersistenceContext();
            wrapper.setLocalUnitOfWork(null);            
        }
      
public voidsetRollbackOnly()
Mark the current transaction so that the only possible outcome of the transaction is for the transaction to be rolled back.

throws
IllegalStateException if isActive() is false.

        if (!isActive()){
            throw new IllegalStateException(TransactionException.transactionNotActive().getMessage());
        }
        this.rollbackOnly = true;