org.springframework.orm.hibernate3
Class SpringSessionSynchronization

java.lang.Object
  extended by org.springframework.orm.hibernate3.SpringSessionSynchronization
All Implemented Interfaces:
Ordered, TransactionSynchronization

 class SpringSessionSynchronization
extends java.lang.Object
implements TransactionSynchronization, Ordered

Callback for resource cleanup at the end of a Spring-managed JTA transaction, that is, when participating in a JtaTransactionManager transaction.

Since:
1.2
Author:
Juergen Hoeller
See Also:
SessionFactoryUtils, JtaTransactionManager

Field Summary
private  boolean hibernateTransactionCompletion
          Whether Hibernate has a looked-up JTA TransactionManager that it will automatically register CacheSynchronizations with on Session connect.
private  boolean holderActive
           
private  SQLExceptionTranslator jdbcExceptionTranslator
           
private  Transaction jtaTransaction
           
private  boolean newSession
           
private  SessionFactory sessionFactory
           
private  SessionHolder sessionHolder
           
 
Fields inherited from interface org.springframework.transaction.support.TransactionSynchronization
STATUS_COMMITTED, STATUS_ROLLED_BACK, STATUS_UNKNOWN
 
Fields inherited from interface org.springframework.core.Ordered
HIGHEST_PRECEDENCE, LOWEST_PRECEDENCE
 
Constructor Summary
SpringSessionSynchronization(SessionHolder sessionHolder, SessionFactory sessionFactory, SQLExceptionTranslator jdbcExceptionTranslator, boolean newSession)
           
 
Method Summary
 void afterCommit()
          Invoked after transaction commit.
 void afterCompletion(int status)
          Invoked after transaction commit/rollback.
 void beforeCommit(boolean readOnly)
          Invoked before transaction commit (before "beforeCompletion").
 void beforeCompletion()
          Invoked before transaction commit/rollback.
 void flush()
          Flush the underlying session to the datastore, if applicable: for example, a Hibernate/JPA session.
private  Session getCurrentSession()
          Check whether there is a Hibernate Session for the current JTA transaction.
 int getOrder()
          Return the order value of this object, with a higher value meaning greater in terms of sorting.
 void resume()
          Resume this synchronization.
 void suspend()
          Suspend this synchronization.
private  DataAccessException translateException(HibernateException ex)
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

sessionHolder

private final SessionHolder sessionHolder

sessionFactory

private final SessionFactory sessionFactory

jdbcExceptionTranslator

private final SQLExceptionTranslator jdbcExceptionTranslator

newSession

private final boolean newSession

hibernateTransactionCompletion

private boolean hibernateTransactionCompletion
Whether Hibernate has a looked-up JTA TransactionManager that it will automatically register CacheSynchronizations with on Session connect.


jtaTransaction

private Transaction jtaTransaction

holderActive

private boolean holderActive
Constructor Detail

SpringSessionSynchronization

public SpringSessionSynchronization(SessionHolder sessionHolder,
                                    SessionFactory sessionFactory,
                                    SQLExceptionTranslator jdbcExceptionTranslator,
                                    boolean newSession)
Method Detail

getCurrentSession

private Session getCurrentSession()
Check whether there is a Hibernate Session for the current JTA transaction. Else, fall back to the default thread-bound Session.


getOrder

public int getOrder()
Description copied from interface: Ordered
Return the order value of this object, with a higher value meaning greater in terms of sorting.

Normally starting with 0, with Integer.MAX_VALUE indicating the greatest value. Same order values will result in arbitrary positions for the affected objects.

Higher values can be interpreted as lower priority. As a consequence, the object with the lowest value has highest priority (somewhat analogous to Servlet "load-on-startup" values).

Specified by:
getOrder in interface Ordered
Returns:
the order value

suspend

public void suspend()
Description copied from interface: TransactionSynchronization
Suspend this synchronization. Supposed to unbind resources from TransactionSynchronizationManager if managing any.

Specified by:
suspend in interface TransactionSynchronization
See Also:
TransactionSynchronizationManager.unbindResource(java.lang.Object)

resume

public void resume()
Description copied from interface: TransactionSynchronization
Resume this synchronization. Supposed to rebind resources to TransactionSynchronizationManager if managing any.

Specified by:
resume in interface TransactionSynchronization
See Also:
TransactionSynchronizationManager.bindResource(java.lang.Object, java.lang.Object)

flush

public void flush()
Description copied from interface: TransactionSynchronization
Flush the underlying session to the datastore, if applicable: for example, a Hibernate/JPA session.

Specified by:
flush in interface TransactionSynchronization
See Also:
TransactionStatus.flush()

beforeCommit

public void beforeCommit(boolean readOnly)
                  throws DataAccessException
Description copied from interface: TransactionSynchronization
Invoked before transaction commit (before "beforeCompletion"). Can e.g. flush transactional O/R Mapping sessions to the database.

This callback does not mean that the transaction will actually be committed. A rollback decision can still occur after this method has been called. This callback is rather meant to perform work that's only relevant if a commit still has a chance to happen, such as flushing SQL statements to the database.

Note that exceptions will get propagated to the commit caller and cause a rollback of the transaction.

Specified by:
beforeCommit in interface TransactionSynchronization
Parameters:
readOnly - whether the transaction is defined as read-only transaction
Throws:
DataAccessException
See Also:
TransactionSynchronization.beforeCompletion()

translateException

private DataAccessException translateException(HibernateException ex)

beforeCompletion

public void beforeCompletion()
Description copied from interface: TransactionSynchronization
Invoked before transaction commit/rollback. Can perform resource cleanup before transaction completion.

This method will be invoked after beforeCommit, even when beforeCommit threw an exception. This callback allows for closing resources before transaction completion, for any outcome.

Specified by:
beforeCompletion in interface TransactionSynchronization
See Also:
TransactionSynchronization.beforeCommit(boolean), TransactionSynchronization.afterCompletion(int)

afterCommit

public void afterCommit()
Description copied from interface: TransactionSynchronization
Invoked after transaction commit. Can perform further operations right after the main transaction has successfully committed.

Can e.g. commit further operations that are supposed to follow on a successful commit of the main transaction, like confirmation messages or emails.

NOTE: The transaction will have been committed already, but the transactional resources might still be active and accessible. As a consequence, any data access code triggered at this point will still "participate" in the original transaction, allowing to perform some cleanup (with no commit following anymore!), unless it explicitly declares that it needs to run in a separate transaction. Hence: Use PROPAGATION_REQUIRES_NEW for any transactional operation that is called from here.

Specified by:
afterCommit in interface TransactionSynchronization

afterCompletion

public void afterCompletion(int status)
Description copied from interface: TransactionSynchronization
Invoked after transaction commit/rollback. Can perform resource cleanup after transaction completion.

NOTE: The transaction will have been committed or rolled back already, but the transactional resources might still be active and accessible. As a consequence, any data access code triggered at this point will still "participate" in the original transaction, allowing to perform some cleanup (with no commit following anymore!), unless it explicitly declares that it needs to run in a separate transaction. Hence: Use PROPAGATION_REQUIRES_NEW for any transactional operation that is called from here.

Specified by:
afterCompletion in interface TransactionSynchronization
Parameters:
status - completion status according to the STATUS_* constants
See Also:
TransactionSynchronization.STATUS_COMMITTED, TransactionSynchronization.STATUS_ROLLED_BACK, TransactionSynchronization.STATUS_UNKNOWN, TransactionSynchronization.beforeCompletion()