| java.lang.Object org.springframework.transaction.support.AbstractPlatformTransactionManager org.springframework.orm.hibernate3.HibernateTransactionManager
HibernateTransactionManager | public class HibernateTransactionManager extends AbstractPlatformTransactionManager implements ResourceTransactionManager,BeanFactoryAware,InitializingBean(Code) | | 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 (on Hibernate 3.1+) or as appropriate
query timeouts (on Hibernate 3.0, when using
HibernateTemplate ).
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 (
HibernateTransactionManager.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
HibernateTransactionManager.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.0.3 or later. As of Spring 2.0, this transaction manager
autodetects Hibernate 3.1 and uses its advanced timeout functionality, while
remaining compatible with Hibernate 3.0 as well. Running against Hibernate 3.1.3+
is recommended, unless you need to remain compatible with JDK 1.3. (Note that
Hibernate 3.1+ only runs on JDK 1.4+!)
author: Juergen Hoeller since: 1.2 See Also: HibernateTransactionManager.setSessionFactory See Also: HibernateTransactionManager.setDataSource See Also: LocalSessionFactoryBean See Also: SessionFactoryUtils.getSession See Also: SessionFactoryUtils.applyTransactionTimeout See Also: SessionFactoryUtils.releaseSession See Also: HibernateTemplate See Also: org.hibernate.SessionFactory.getCurrentSession See Also: org.springframework.jdbc.datasource.DataSourceUtils.getConnection See Also: org.springframework.jdbc.datasource.DataSourceUtils.applyTransactionTimeout See Also: org.springframework.jdbc.datasource.DataSourceUtils.releaseConnection See Also: org.springframework.jdbc.core.JdbcTemplate See Also: org.springframework.jdbc.datasource.DataSourceTransactionManager See Also: org.springframework.transaction.jta.JtaTransactionManager |
Method Summary | |
public void | afterPropertiesSet() | protected DataAccessException | convertHibernateAccessException(HibernateException ex) Convert the given HibernateException to an appropriate exception
from the org.springframework.dao hierarchy. | 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() Obtain a default SQLExceptionTranslator, lazily creating it if necessary. | public Interceptor | getEntityInterceptor() Return the current Hibernate entity interceptor, or null if none. | 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. | public void | setAutodetectDataSource(boolean autodetectDataSource) Set whether to autodetect a JDBC DataSource used by the Hibernate SessionFactory,
if set via LocalSessionFactoryBean's setDataSource . | public void | setBeanFactory(BeanFactory beanFactory) The bean factory just needs to be known for resolving entity interceptor
bean names. | 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. | 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. | 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. | public void | setJdbcExceptionTranslator(SQLExceptionTranslator jdbcExceptionTranslator) Set the JDBC exception translator for this transaction manager. | 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". | public void | setSessionFactory(SessionFactory sessionFactory) Set the SessionFactory that this instance should manage transactions for. |
HibernateTransactionManager | public HibernateTransactionManager(SessionFactory sessionFactory)(Code) | | Create a new HibernateTransactionManager instance.
Parameters: sessionFactory - SessionFactory to manage transactions for |
afterPropertiesSet | public void afterPropertiesSet()(Code) | | |
convertJdbcAccessException | protected DataAccessException convertJdbcAccessException(JDBCException ex, SQLExceptionTranslator translator)(Code) | | Convert the given Hibernate JDBCException to an appropriate exception
from the org.springframework.dao hierarchy, using the
given SQLExceptionTranslator.
Parameters: ex - Hibernate JDBCException that occured Parameters: translator - the SQLExceptionTranslator to use a corresponding DataAccessException |
doCleanupAfterCompletion | protected void doCleanupAfterCompletion(Object transaction)(Code) | | |
getDataSource | public DataSource getDataSource()(Code) | | Return the JDBC DataSource that this instance manages transactions for.
|
getJdbcExceptionTranslator | public SQLExceptionTranslator getJdbcExceptionTranslator()(Code) | | Return the JDBC exception translator for this transaction manager, if any.
|
getSessionFactory | public SessionFactory getSessionFactory()(Code) | | Return the SessionFactory that this instance should manage transactions for.
|
isExistingTransaction | protected boolean isExistingTransaction(Object transaction)(Code) | | |
isSameConnectionForEntireSession | protected boolean isSameConnectionForEntireSession(Session session)(Code) | | 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.0/3.1. If that cast doesn't work, we'll simply assume
we're safe and return true .
Parameters: session - the Hibernate Session to check See Also: org.hibernate.impl.SessionImpl.getConnectionReleaseMode See Also: org.hibernate.ConnectionReleaseMode.ON_CLOSE |
setAutodetectDataSource | public void setAutodetectDataSource(boolean autodetectDataSource)(Code) | | 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,
to not expose Hibernate transactions as JDBC transactions for that DataSource.
See Also: HibernateTransactionManager.setDataSource See Also: LocalSessionFactoryBean.setDataSource |
setDataSource | public void setDataSource(DataSource dataSource)(Code) | | 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.
See Also: HibernateTransactionManager.setAutodetectDataSource See Also: LocalDataSourceConnectionProvider See Also: LocalSessionFactoryBean.setDataSource See Also: org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy See Also: org.springframework.jdbc.datasource.DataSourceUtils See Also: org.springframework.jdbc.core.JdbcTemplate |
setEntityInterceptor | public void setEntityInterceptor(Interceptor entityInterceptor)(Code) | | 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.
See Also: LocalSessionFactoryBean.setEntityInterceptor See Also: HibernateTemplate.setEntityInterceptor See Also: HibernateInterceptor.setEntityInterceptor |
setEntityInterceptorBeanName | public void setEntityInterceptorBeanName(String entityInterceptorBeanName)(Code) | | 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.
Parameters: entityInterceptorBeanName - the name of the entity interceptor inthe bean factory See Also: HibernateTransactionManager.setBeanFactory See Also: HibernateTransactionManager.setEntityInterceptor |
setPrepareConnection | public void setPrepareConnection(boolean prepareConnection)(Code) | | 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).
See Also: java.sql.Connection.setTransactionIsolation See Also: java.sql.Connection.setReadOnly |
setSessionFactory | public void setSessionFactory(SessionFactory sessionFactory)(Code) | | Set the SessionFactory that this instance should manage transactions for.
|
Fields inherited from org.springframework.transaction.support.AbstractPlatformTransactionManager | final public static int SYNCHRONIZATION_ALWAYS(Code)(Java Doc) final public static int SYNCHRONIZATION_NEVER(Code)(Java Doc) final public static int SYNCHRONIZATION_ON_ACTUAL_TRANSACTION(Code)(Java Doc) protected transient Log logger(Code)(Java Doc)
|
Methods inherited from org.springframework.transaction.support.AbstractPlatformTransactionManager | final public void commit(TransactionStatus status) throws TransactionException(Code)(Java Doc) protected int determineTimeout(TransactionDefinition definition)(Code)(Java Doc) abstract protected void doBegin(Object transaction, TransactionDefinition definition) throws TransactionException(Code)(Java Doc) protected void doCleanupAfterCompletion(Object transaction)(Code)(Java Doc) abstract protected void doCommit(DefaultTransactionStatus status) throws TransactionException(Code)(Java Doc) abstract protected Object doGetTransaction() throws TransactionException(Code)(Java Doc) protected void doResume(Object transaction, Object suspendedResources) throws TransactionException(Code)(Java Doc) abstract protected void doRollback(DefaultTransactionStatus status) throws TransactionException(Code)(Java Doc) protected void doSetRollbackOnly(DefaultTransactionStatus status) throws TransactionException(Code)(Java Doc) protected Object doSuspend(Object transaction) throws TransactionException(Code)(Java Doc) final public int getDefaultTimeout()(Code)(Java Doc) final public TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException(Code)(Java Doc) final public int getTransactionSynchronization()(Code)(Java Doc) final protected void invokeAfterCompletion(List synchronizations, int completionStatus)(Code)(Java Doc) protected boolean isExistingTransaction(Object transaction) throws TransactionException(Code)(Java Doc) final public boolean isFailEarlyOnGlobalRollbackOnly()(Code)(Java Doc) final public boolean isGlobalRollbackOnParticipationFailure()(Code)(Java Doc) final public boolean isNestedTransactionAllowed()(Code)(Java Doc) final public boolean isRollbackOnCommitFailure()(Code)(Java Doc) protected DefaultTransactionStatus newTransactionStatus(TransactionDefinition definition, Object transaction, boolean newTransaction, boolean newSynchronization, boolean debug, Object suspendedResources)(Code)(Java Doc) protected void registerAfterCompletionWithExistingTransaction(Object transaction, List synchronizations) throws TransactionException(Code)(Java Doc) final protected void resume(Object transaction, SuspendedResourcesHolder resourcesHolder) throws TransactionException(Code)(Java Doc) final public void rollback(TransactionStatus status) throws TransactionException(Code)(Java Doc) final public void setDefaultTimeout(int defaultTimeout)(Code)(Java Doc) final public void setFailEarlyOnGlobalRollbackOnly(boolean failEarlyOnGlobalRollbackOnly)(Code)(Java Doc) final public void setGlobalRollbackOnParticipationFailure(boolean globalRollbackOnParticipationFailure)(Code)(Java Doc) final public void setNestedTransactionAllowed(boolean nestedTransactionAllowed)(Code)(Java Doc) final public void setRollbackOnCommitFailure(boolean rollbackOnCommitFailure)(Code)(Java Doc) final public void setTransactionSynchronization(int transactionSynchronization)(Code)(Java Doc) final public void setTransactionSynchronizationName(String constantName)(Code)(Java Doc) protected boolean shouldCommitOnGlobalRollbackOnly()(Code)(Java Doc) final protected SuspendedResourcesHolder suspend(Object transaction) throws TransactionException(Code)(Java Doc) final protected void triggerBeforeCommit(DefaultTransactionStatus status)(Code)(Java Doc) final protected void triggerBeforeCompletion(DefaultTransactionStatus status)(Code)(Java Doc) protected boolean useSavepointForNestedTransaction()(Code)(Java Doc)
|
|
|