Save This Page
Home » spring-framework-2.5.6-with-dependencies » org.springframework » orm » hibernate3 » [javadoc | source]
org.springframework.orm.hibernate3
public class: HibernateTransactionManager [javadoc | source]
java.lang.Object
   org.springframework.transaction.support.AbstractPlatformTransactionManager
      org.springframework.orm.hibernate3.HibernateTransactionManager

All Implemented Interfaces:
    BeanFactoryAware, InitializingBean, ResourceTransactionManager, PlatformTransactionManager, Serializable

org.springframework.transaction.PlatformTransactionManager implementation for a single Hibernate org.hibernate.SessionFactory . Binds a Hibernate Session from the specified factory to the thread, potentially allowing for one thread-bound Session per factory. SessionFactoryUtils and HibernateTemplate are aware of thread-bound Sessions and participate in such transactions automatically. Using either of those or going through SessionFactory.getCurrentSession() is required for Hibernate access code that needs to support this transaction handling mechanism.

Supports custom isolation levels, and timeouts that get applied as Hibernate transaction timeouts.

This transaction manager is appropriate for applications that use a single Hibernate SessionFactory for transactional data access, but it also supports direct DataSource access within a transaction (i.e. plain JDBC code working with the same DataSource). This allows for mixing services which access Hibernate and services which use plain JDBC (without being aware of Hibernate)! Application code needs to stick to the same simple Connection lookup pattern as with org.springframework.jdbc.datasource.DataSourceTransactionManager (i.e. org.springframework.jdbc.datasource.DataSourceUtils#getConnection or going through a org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy ).

Note: To be able to register a DataSource's Connection for plain JDBC code, this instance needs to be aware of the DataSource (#setDataSource ). The given DataSource should obviously match the one used by the given SessionFactory. To achieve this, configure both to the same JNDI DataSource, or preferably create the SessionFactory with LocalSessionFactoryBean and a local DataSource (which will be autodetected by this transaction manager).

JTA (usually through org.springframework.transaction.jta.JtaTransactionManager ) is necessary for accessing multiple transactional resources within the same transaction. The DataSource that Hibernate uses needs to be JTA-enabled in such a scenario (see container setup). Normally, JTA setup for Hibernate is somewhat container-specific due to the JTA TransactionManager lookup, required for proper transactional handling of the SessionFactory-level read-write cache.

Fortunately, there is an easier way with Spring: SessionFactoryUtils (and thus HibernateTemplate ) registers synchronizations with Spring's org.springframework.transaction.support.TransactionSynchronizationManager (as used by org.springframework.transaction.jta.JtaTransactionManager ), for proper after-completion callbacks. Therefore, as long as Spring's JtaTransactionManager drives the JTA transactions, Hibernate does not require any special configuration for proper JTA participation. Note that there are special restrictions with EJB CMT and restrictive JTA subsystems: See org.springframework.transaction.jta.JtaTransactionManager 's javadoc for details.

On JDBC 3.0, this transaction manager supports nested transactions via JDBC 3.0 Savepoints. The #setNestedTransactionAllowed "nestedTransactionAllowed"} flag defaults to "false", though, as nested transactions will just apply to the JDBC Connection, not to the Hibernate Session and its cached objects. You can manually set the flag to "true" if you want to use nested transactions for JDBC access code which participates in Hibernate transactions (provided that your JDBC driver supports Savepoints). Note that Hibernate itself does not support nested transactions! Hence, do not expect Hibernate access code to semantically participate in a nested transaction.

Requires Hibernate 3.1 or later, as of Spring 2.5.

Fields inherited from org.springframework.transaction.support.AbstractPlatformTransactionManager:
SYNCHRONIZATION_ALWAYS,  SYNCHRONIZATION_ON_ACTUAL_TRANSACTION,  SYNCHRONIZATION_NEVER,  logger
Constructor:
 public HibernateTransactionManager() 
 public HibernateTransactionManager(SessionFactory sessionFactory) 
    Create a new HibernateTransactionManager instance.
    Parameters:
    sessionFactory - SessionFactory to manage transactions for
Method from org.springframework.orm.hibernate3.HibernateTransactionManager Summary:
afterPropertiesSet,   convertHibernateAccessException,   convertJdbcAccessException,   doBegin,   doCleanupAfterCompletion,   doCommit,   doGetTransaction,   doResume,   doRollback,   doSetRollbackOnly,   doSuspend,   getDataSource,   getDefaultJdbcExceptionTranslator,   getEntityInterceptor,   getJdbcExceptionTranslator,   getResourceFactory,   getSessionFactory,   isExistingTransaction,   isSameConnectionForEntireSession,   prepareForCommit,   setAutodetectDataSource,   setBeanFactory,   setDataSource,   setEarlyFlushBeforeCommit,   setEntityInterceptor,   setEntityInterceptorBeanName,   setHibernateManagedSession,   setJdbcExceptionTranslator,   setPrepareConnection,   setSessionFactory
Methods from org.springframework.transaction.support.AbstractPlatformTransactionManager:
commit,   determineTimeout,   doBegin,   doCleanupAfterCompletion,   doCommit,   doGetTransaction,   doResume,   doRollback,   doSetRollbackOnly,   doSuspend,   getDefaultTimeout,   getTransaction,   getTransactionSynchronization,   invokeAfterCompletion,   isExistingTransaction,   isFailEarlyOnGlobalRollbackOnly,   isGlobalRollbackOnParticipationFailure,   isNestedTransactionAllowed,   isRollbackOnCommitFailure,   isValidateExistingTransaction,   newTransactionStatus,   prepareForCommit,   registerAfterCompletionWithExistingTransaction,   resume,   rollback,   setDefaultTimeout,   setFailEarlyOnGlobalRollbackOnly,   setGlobalRollbackOnParticipationFailure,   setNestedTransactionAllowed,   setRollbackOnCommitFailure,   setTransactionSynchronization,   setTransactionSynchronizationName,   setValidateExistingTransaction,   shouldCommitOnGlobalRollbackOnly,   suspend,   triggerBeforeCommit,   triggerBeforeCompletion,   useSavepointForNestedTransaction
Methods from java.lang.Object:
equals,   getClass,   hashCode,   notify,   notifyAll,   toString,   wait,   wait,   wait
Method from org.springframework.orm.hibernate3.HibernateTransactionManager Detail:
 public  void afterPropertiesSet() 
 protected DataAccessException convertHibernateAccessException(HibernateException ex) 
    Convert the given HibernateException to an appropriate exception from the org.springframework.dao hierarchy.

    Will automatically apply a specified SQLExceptionTranslator to a Hibernate JDBCException, else rely on Hibernate's default translation.

 protected DataAccessException convertJdbcAccessException(JDBCException ex,
    SQLExceptionTranslator translator) 
    Convert the given Hibernate JDBCException to an appropriate exception from the org.springframework.dao hierarchy, using the given SQLExceptionTranslator.
 protected  void doBegin(Object transaction,
    TransactionDefinition definition) 
 protected  void doCleanupAfterCompletion(Object transaction) 
 protected  void doCommit(DefaultTransactionStatus status) 
 protected Object doGetTransaction() 
 protected  void doResume(Object transaction,
    Object suspendedResources) 
 protected  void doRollback(DefaultTransactionStatus status) 
 protected  void doSetRollbackOnly(DefaultTransactionStatus status) 
 protected Object doSuspend(Object transaction) 
 public DataSource getDataSource() 
    Return the JDBC DataSource that this instance manages transactions for.
 protected synchronized SQLExceptionTranslator getDefaultJdbcExceptionTranslator() 
 public Interceptor getEntityInterceptor() throws IllegalStateException, BeansException 
    Return the current Hibernate entity interceptor, or null if none. Resolves an entity interceptor bean name via the bean factory, if necessary.
 public SQLExceptionTranslator getJdbcExceptionTranslator() 
    Return the JDBC exception translator for this transaction manager, if any.
 public Object getResourceFactory() 
 public SessionFactory getSessionFactory() 
    Return the SessionFactory that this instance should manage transactions for.
 protected boolean isExistingTransaction(Object transaction) 
 protected boolean isSameConnectionForEntireSession(Session session) 
    Return whether the given Hibernate Session will always hold the same JDBC Connection. This is used to check whether the transaction manager can safely prepare and clean up the JDBC Connection used for a transaction.

    Default implementation checks the Session's connection release mode to be "on_close". Unfortunately, this requires casting to SessionImpl, as of Hibernate 3.1. If that cast doesn't work, we'll simply assume we're safe and return true.

 protected  void prepareForCommit(DefaultTransactionStatus status) 
 public  void setAutodetectDataSource(boolean autodetectDataSource) 
    Set whether to autodetect a JDBC DataSource used by the Hibernate SessionFactory, if set via LocalSessionFactoryBean's setDataSource. Default is "true".

    Can be turned off to deliberately ignore an available DataSource, in order to not expose Hibernate transactions as JDBC transactions for that DataSource.

 public  void setBeanFactory(BeanFactory beanFactory) 
    The bean factory just needs to be known for resolving entity interceptor bean names. It does not need to be set for any other mode of operation.
 public  void setDataSource(DataSource dataSource) 
    Set the JDBC DataSource that this instance should manage transactions for. The DataSource should match the one used by the Hibernate SessionFactory: for example, you could specify the same JNDI DataSource for both.

    If the SessionFactory was configured with LocalDataSourceConnectionProvider, i.e. by Spring's LocalSessionFactoryBean with a specified "dataSource", the DataSource will be auto-detected: You can still explictly specify the DataSource, but you don't need to in this case.

    A transactional JDBC Connection for this DataSource will be provided to application code accessing this DataSource directly via DataSourceUtils or JdbcTemplate. The Connection will be taken from the Hibernate Session.

    The DataSource specified here should be the target DataSource to manage transactions for, not a TransactionAwareDataSourceProxy. Only data access code may work with TransactionAwareDataSourceProxy, while the transaction manager needs to work on the underlying target DataSource. If there's nevertheless a TransactionAwareDataSourceProxy passed in, it will be unwrapped to extract its target DataSource.

 public  void setEarlyFlushBeforeCommit(boolean earlyFlushBeforeCommit) 
    Set whether to perform an early flush before proceeding with a commit.

    Default is "false", performing an implicit flush as part of the actual commit step. Switch this to "true" in order to enforce an explicit early flush right before the actual commit step.

    An early flush happens before the before-commit synchronization phase, making flushed state visible to beforeCommit callbacks of registered org.springframework.transaction.support.TransactionSynchronization objects. Such explicit flush behavior is consistent with Spring-driven flushing in a JTA transaction environment, so may also get enforced for consistency with JTA transaction behavior.

 public  void setEntityInterceptor(Interceptor entityInterceptor) 
    Set a Hibernate entity interceptor that allows to inspect and change property values before writing to and reading from the database. Will get applied to any new Session created by this transaction manager.

    Such an interceptor can either be set at the SessionFactory level, i.e. on LocalSessionFactoryBean, or at the Session level, i.e. on HibernateTemplate, HibernateInterceptor, and HibernateTransactionManager. It's preferable to set it on LocalSessionFactoryBean or HibernateTransactionManager to avoid repeated configuration and guarantee consistent behavior in transactions.

 public  void setEntityInterceptorBeanName(String entityInterceptorBeanName) 
    Set the bean name of a Hibernate entity interceptor that allows to inspect and change property values before writing to and reading from the database. Will get applied to any new Session created by this transaction manager.

    Requires the bean factory to be known, to be able to resolve the bean name to an interceptor instance on session creation. Typically used for prototype interceptors, i.e. a new interceptor instance per session.

    Can also be used for shared interceptor instances, but it is recommended to set the interceptor reference directly in such a scenario.

 public  void setHibernateManagedSession(boolean hibernateManagedSession) 
    Set whether to operate on a Hibernate-managed Session instead of a Spring-managed Session, that is, whether to obtain the Session through Hibernate's org.hibernate.SessionFactory#getCurrentSession() instead of org.hibernate.SessionFactory#openSession() (with a Spring org.springframework.transaction.support.TransactionSynchronizationManager check preceding it).

    Default is "false", i.e. using a Spring-managed Session: taking the current thread-bound Session if available (e.g. in an Open-Session-in-View scenario), creating a new Session for the current transaction otherwise.

    Switch this flag to "true" in order to enforce use of a Hibernate-managed Session. Note that this requires org.hibernate.SessionFactory#getCurrentSession() to always return a proper Session when called for a Spring-managed transaction; transaction begin will fail if the getCurrentSession() call fails.

    This mode will typically be used in combination with a custom Hibernate org.hibernate.context.CurrentSessionContext implementation that stores Sessions in a place other than Spring's TransactionSynchronizationManager. It may also be used in combination with Spring's Open-Session-in-View support (using Spring's default SpringSessionContext ), in which case it subtly differs from the Spring-managed Session mode: The pre-bound Session will not receive a clear() call (on rollback) or a disconnect() call (on transaction completion) in such a scenario; this is rather left up to a custom CurrentSessionContext implementation (if desired).

 public  void setJdbcExceptionTranslator(SQLExceptionTranslator jdbcExceptionTranslator) 
    Set the JDBC exception translator for this transaction manager.

    Applied to any SQLException root cause of a Hibernate JDBCException that is thrown on flush, overriding Hibernate's default SQLException translation (which is based on Hibernate's Dialect for a specific target database).

 public  void setPrepareConnection(boolean prepareConnection) 
    Set whether to prepare the underlying JDBC Connection of a transactional Hibernate Session, that is, whether to apply a transaction-specific isolation level and/or the transaction's read-only flag to the underlying JDBC Connection.

    Default is "true". If you turn this flag off, the transaction manager will not support per-transaction isolation levels anymore. It will not call Connection.setReadOnly(true) for read-only transactions anymore either. If this flag is turned off, no cleanup of a JDBC Connection is required after a transaction, since no Connection settings will get modified.

    It is recommended to turn this flag off if running against Hibernate 3.1 and a connection pool that does not reset connection settings (for example, Jakarta Commons DBCP). To keep this flag turned on, you can set the "hibernate.connection.release_mode" property to "on_close" instead, or consider using a smarter connection pool (for example, C3P0).

 public  void setSessionFactory(SessionFactory sessionFactory) 
    Set the SessionFactory that this instance should manage transactions for.