|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectorg.springframework.orm.hibernate3.SessionFactoryUtils
public abstract class SessionFactoryUtils
Helper class featuring methods for Hibernate Session handling, allowing for reuse of Hibernate Session instances within transactions. Also provides support for exception translation.
Supports synchronization with both Spring-managed JTA transactions
(see JtaTransactionManager
)
and non-Spring JTA transactions (i.e. plain JTA or EJB CMT),
transparently providing transaction-scoped Hibernate Sessions.
Note that for non-Spring JTA transactions, a JTA TransactionManagerLookup
has to be specified in the Hibernate configuration.
Used internally by HibernateTemplate
, HibernateInterceptor
and HibernateTransactionManager
. Can also be used directly in
application code.
getSession(SessionFactory, boolean)
,
releaseSession(Session, SessionFactory)
,
HibernateTransactionManager
,
JtaTransactionManager
,
TransactionSynchronizationManager
Field Summary | |
---|---|
private static java.lang.ThreadLocal<java.util.Map<SessionFactory,java.util.Set<Session>>> |
deferredCloseHolder
|
(package private) static Log |
logger
|
static int |
SESSION_SYNCHRONIZATION_ORDER
Order value for TransactionSynchronization objects that clean up Hibernate Sessions. |
Constructor Summary | |
---|---|
SessionFactoryUtils()
|
Method Summary | |
---|---|
static void |
applyTransactionTimeout(Criteria criteria,
SessionFactory sessionFactory)
Apply the current transaction timeout, if any, to the given Hibernate Criteria object. |
static void |
applyTransactionTimeout(Query query,
SessionFactory sessionFactory)
Apply the current transaction timeout, if any, to the given Hibernate Query object. |
static void |
closeSession(Session session)
Perform actual closing of the Hibernate Session, catching and logging any cleanup exceptions thrown. |
(package private) static void |
closeSessionOrRegisterDeferredClose(Session session,
SessionFactory sessionFactory)
Close the given Session or register it for deferred close. |
static DataAccessException |
convertHibernateAccessException(HibernateException ex)
Convert the given HibernateException to an appropriate exception from the org.springframework.dao hierarchy. |
static Session |
doGetSession(SessionFactory sessionFactory,
boolean allowCreate)
Get a Hibernate Session for the given SessionFactory. |
private static Session |
doGetSession(SessionFactory sessionFactory,
Interceptor entityInterceptor,
SQLExceptionTranslator jdbcExceptionTranslator,
boolean allowCreate)
Get a Hibernate Session for the given SessionFactory. |
static javax.sql.DataSource |
getDataSource(SessionFactory sessionFactory)
Determine the DataSource of the given SessionFactory. |
private static Session |
getJtaSynchronizedSession(SessionHolder sessionHolder,
SessionFactory sessionFactory,
SQLExceptionTranslator jdbcExceptionTranslator)
Retrieve a Session from the given SessionHolder, potentially from a JTA transaction synchronization. |
static TransactionManager |
getJtaTransactionManager(SessionFactory sessionFactory,
Session session)
Try to retrieve the JTA TransactionManager from the given SessionFactory and/or Session. |
static Session |
getNewSession(SessionFactory sessionFactory)
Get a new Hibernate Session from the given SessionFactory. |
static Session |
getNewSession(SessionFactory sessionFactory,
Interceptor entityInterceptor)
Get a new Hibernate Session from the given SessionFactory. |
static Session |
getSession(SessionFactory sessionFactory,
boolean allowCreate)
Get a Hibernate Session for the given SessionFactory. |
static Session |
getSession(SessionFactory sessionFactory,
Interceptor entityInterceptor,
SQLExceptionTranslator jdbcExceptionTranslator)
Get a Hibernate Session for the given SessionFactory. |
static boolean |
hasTransactionalSession(SessionFactory sessionFactory)
Return whether there is a transactional Hibernate Session for the current thread, that is, a Session bound to the current thread by Spring's transaction facilities. |
static void |
initDeferredClose(SessionFactory sessionFactory)
Initialize deferred close for the current thread and the given SessionFactory. |
static boolean |
isDeferredCloseActive(SessionFactory sessionFactory)
Determine whether deferred close is active for the current thread and the given SessionFactory. |
static boolean |
isSessionTransactional(Session session,
SessionFactory sessionFactory)
Return whether the given Hibernate Session is transactional, that is, bound to the current thread by Spring's transaction facilities. |
static SQLExceptionTranslator |
newJdbcExceptionTranslator(SessionFactory sessionFactory)
Create an appropriate SQLExceptionTranslator for the given SessionFactory. |
static void |
processDeferredClose(SessionFactory sessionFactory)
Process all Hibernate Sessions that have been registered for deferred close for the given SessionFactory. |
private static void |
registerJtaSynchronization(Session session,
SessionFactory sessionFactory,
SQLExceptionTranslator jdbcExceptionTranslator,
SessionHolder sessionHolder)
Register a JTA synchronization for the given Session, if any. |
static void |
releaseSession(Session session,
SessionFactory sessionFactory)
Close the given Session, created via the given factory, if it is not managed externally (i.e. |
static java.lang.String |
toString(Session session)
Stringify the given Session for debug logging. |
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Field Detail |
---|
public static final int SESSION_SYNCHRONIZATION_ORDER
DataSourceUtils.CONNECTION_SYNCHRONIZATION_ORDER - 100
to execute Session cleanup before JDBC Connection cleanup, if any.
DataSourceUtils.CONNECTION_SYNCHRONIZATION_ORDER
,
Constant Field Valuesstatic final Log logger
private static final java.lang.ThreadLocal<java.util.Map<SessionFactory,java.util.Set<Session>>> deferredCloseHolder
Constructor Detail |
---|
public SessionFactoryUtils()
Method Detail |
---|
public static javax.sql.DataSource getDataSource(SessionFactory sessionFactory)
sessionFactory
- the SessionFactory to check
null
if none foundorg.hibernate.engine.SessionFactoryImplementor#getConnectionProvider
,
LocalDataSourceConnectionProvider
public static SQLExceptionTranslator newJdbcExceptionTranslator(SessionFactory sessionFactory)
sessionFactory
- the SessionFactory to create the translator for
getDataSource(SessionFactory)
,
SQLErrorCodeSQLExceptionTranslator
,
SQLStateSQLExceptionTranslator
public static TransactionManager getJtaTransactionManager(SessionFactory sessionFactory, Session session)
sessionFactory
- Hibernate SessionFactorysession
- Hibernate Session (can also be null
)
javax.transaction.TransactionManager
,
SessionFactoryImplementor#getTransactionManager
,
Session#getSessionFactory
,
org.hibernate.impl.SessionFactoryImpl
public static Session getSession(SessionFactory sessionFactory, boolean allowCreate) throws DataAccessResourceFailureException, java.lang.IllegalStateException
HibernateTransactionManager
. Will create a new
Session otherwise, if "allowCreate" is true
.
This is the getSession
method used by typical data access code,
in combination with releaseSession
called when done with
the Session. Note that HibernateTemplate allows to write data access code
without caring about such resource handling.
sessionFactory
- Hibernate SessionFactory to create the session withallowCreate
- whether a non-transactional Session should be created
when no transactional Session can be found for the current thread
DataAccessResourceFailureException
- if the Session couldn't be created
java.lang.IllegalStateException
- if no thread-bound Session found and
"allowCreate" is false
getSession(SessionFactory, Interceptor, SQLExceptionTranslator)
,
releaseSession(Session, SessionFactory)
,
HibernateTemplate
public static Session getSession(SessionFactory sessionFactory, Interceptor entityInterceptor, SQLExceptionTranslator jdbcExceptionTranslator) throws DataAccessResourceFailureException
HibernateTransactionManager
. Will always create
a new Session otherwise.
Supports setting a Session-level Hibernate entity interceptor that allows to inspect and change property values before writing to and reading from the database. Such an interceptor can also be set at the SessionFactory level (i.e. on LocalSessionFactoryBean), on HibernateTransactionManager, or on HibernateInterceptor/HibernateTemplate.
sessionFactory
- Hibernate SessionFactory to create the session withentityInterceptor
- Hibernate entity interceptor, or null
if nonejdbcExceptionTranslator
- SQLExcepionTranslator to use for flushing the
Session on transaction synchronization (may be null
; only used
when actually registering a transaction synchronization)
DataAccessResourceFailureException
- if the Session couldn't be createdLocalSessionFactoryBean.setEntityInterceptor(Interceptor)
,
HibernateAccessor.setEntityInterceptor(Interceptor)
,
HibernateAccessor.setEntityInterceptor(Interceptor)
public static Session doGetSession(SessionFactory sessionFactory, boolean allowCreate) throws HibernateException, java.lang.IllegalStateException
HibernateTransactionManager
. Will create a new
Session otherwise, if "allowCreate" is true
.
Throws the original HibernateException, in contrast to getSession(SessionFactory, boolean)
.
sessionFactory
- Hibernate SessionFactory to create the session withallowCreate
- whether a non-transactional Session should be created
when no transactional Session can be found for the current thread
HibernateException
- if the Session couldn't be created
java.lang.IllegalStateException
- if no thread-bound Session found and allowCreate falseprivate static Session doGetSession(SessionFactory sessionFactory, Interceptor entityInterceptor, SQLExceptionTranslator jdbcExceptionTranslator, boolean allowCreate) throws HibernateException, java.lang.IllegalStateException
HibernateTransactionManager
. Will create a new
Session otherwise, if "allowCreate" is true
.
Same as getSession(SessionFactory, boolean)
, but throwing the original HibernateException.
sessionFactory
- Hibernate SessionFactory to create the session withentityInterceptor
- Hibernate entity interceptor, or null
if nonejdbcExceptionTranslator
- SQLExcepionTranslator to use for flushing the
Session on transaction synchronization (may be null
)allowCreate
- whether a non-transactional Session should be created
when no transactional Session can be found for the current thread
HibernateException
- if the Session couldn't be created
java.lang.IllegalStateException
- if no thread-bound Session found and
"allowCreate" is false
private static Session getJtaSynchronizedSession(SessionHolder sessionHolder, SessionFactory sessionFactory, SQLExceptionTranslator jdbcExceptionTranslator) throws DataAccessResourceFailureException
sessionHolder
- the SessionHolder to checksessionFactory
- the SessionFactory to get the JTA TransactionManager fromjdbcExceptionTranslator
- SQLExcepionTranslator to use for flushing the
Session on transaction synchronization (may be null
)
DataAccessResourceFailureException
- if the Session couldn't be createdprivate static void registerJtaSynchronization(Session session, SessionFactory sessionFactory, SQLExceptionTranslator jdbcExceptionTranslator, SessionHolder sessionHolder)
sessionHolder
- the existing thread-bound SessionHolder, if anysession
- the Session to registersessionFactory
- the SessionFactory that the Session was created withjdbcExceptionTranslator
- SQLExcepionTranslator to use for flushing the
Session on transaction synchronization (may be null
)public static Session getNewSession(SessionFactory sessionFactory)
Within a transaction, this method will create a new Session that shares the transaction's JDBC Connection. More specifically, it will use the same JDBC Connection as the pre-bound Hibernate Session.
sessionFactory
- Hibernate SessionFactory to create the session with
public static Session getNewSession(SessionFactory sessionFactory, Interceptor entityInterceptor)
Within a transaction, this method will create a new Session that shares the transaction's JDBC Connection. More specifically, it will use the same JDBC Connection as the pre-bound Hibernate Session.
sessionFactory
- Hibernate SessionFactory to create the session withentityInterceptor
- Hibernate entity interceptor, or null
if none
public static java.lang.String toString(Session session)
Object.toString()
:
the fully qualified class name + "@" + the identity hash code.
The sole reason why this is necessary is because Hibernate3's
Session.toString()
implementation is broken (and won't be fixed):
it logs the toString representation of all persistent objects in the Session,
which might lead to ConcurrentModificationExceptions if the persistent objects
in turn refer to the Session (for example, for lazy loading).
session
- the Hibernate Session to stringify
public static boolean hasTransactionalSession(SessionFactory sessionFactory)
sessionFactory
- Hibernate SessionFactory to check (may be null
)
public static boolean isSessionTransactional(Session session, SessionFactory sessionFactory)
session
- the Hibernate Session to checksessionFactory
- Hibernate SessionFactory that the Session was created with
(may be null
)
public static void applyTransactionTimeout(Query query, SessionFactory sessionFactory)
query
- the Hibernate Query objectsessionFactory
- Hibernate SessionFactory that the Query was created for
(may be null
)org.hibernate.Query#setTimeout
public static void applyTransactionTimeout(Criteria criteria, SessionFactory sessionFactory)
criteria
- the Hibernate Criteria objectsessionFactory
- Hibernate SessionFactory that the Criteria was created fororg.hibernate.Criteria#setTimeout
public static DataAccessException convertHibernateAccessException(HibernateException ex)
org.springframework.dao
hierarchy.
ex
- HibernateException that occured
HibernateAccessor.convertHibernateAccessException(HibernateException)
,
HibernateTransactionManager.convertHibernateAccessException(HibernateException)
public static boolean isDeferredCloseActive(SessionFactory sessionFactory)
sessionFactory
- the Hibernate SessionFactory to check
public static void initDeferredClose(SessionFactory sessionFactory)
processDeferredClose(SessionFactory)
call at a finishing point (like request completion).
Used by OpenSessionInViewFilter
and OpenSessionInViewInterceptor
when not configured for a single session.
sessionFactory
- the Hibernate SessionFactory to initialize deferred close forprocessDeferredClose(SessionFactory)
,
releaseSession(Session, SessionFactory)
,
OpenSessionInViewFilter.setSingleSession(boolean)
,
OpenSessionInViewInterceptor.setSingleSession(boolean)
public static void processDeferredClose(SessionFactory sessionFactory)
sessionFactory
- the Hibernate SessionFactory to process deferred close forinitDeferredClose(SessionFactory)
,
releaseSession(Session, SessionFactory)
public static void releaseSession(Session session, SessionFactory sessionFactory)
session
- the Hibernate Session to close (may be null
)sessionFactory
- Hibernate SessionFactory that the Session was created with
(may be null
)static void closeSessionOrRegisterDeferredClose(Session session, SessionFactory sessionFactory)
session
- the Hibernate Session to closesessionFactory
- Hibernate SessionFactory that the Session was created with
(may be null
)initDeferredClose(SessionFactory)
,
processDeferredClose(SessionFactory)
public static void closeSession(Session session)
session
- the Hibernate Session to close (may be null
)org.hibernate.Session#close()
|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |