Servlet 2.3 Filter that binds a Hibernate Session to the thread for the entire
processing of the request. Intended for the "Open Session in View" pattern,
i.e. to allow for lazy loading in web views despite the original transactions
already being completed.
This filter works similar to the AOP HibernateInterceptor: It just makes
Hibernate Sessions available via the thread. It is suitable for non-transactional
execution but also for business layer transactions via HibernateTransactionManager
or JtaTransactionManager. In the latter case, Sessions pre-bound by this filter
will automatically be used for the transactions and flushed accordingly.
WARNING: Applying this filter to existing logic can cause issues that
have not appeared before, through the use of a single Hibernate Session for the
processing of an entire request. In particular, the reassociation of persistent
objects with a Hibernate Session has to occur at the very beginning of request
processing, to avoid clashes with already loaded instances of the same objects.
Alternatively, turn this filter into deferred close mode, by specifying
"singleSession"="false": It will not use a single session per request then,
but rather let each data access operation or transaction use its own session
(like without Open Session in View). Each of those sessions will be registered
for deferred close, though, actually processed at request completion.
A single session per request allows for most efficient first-level caching,
but can cause side effects, for example on saveOrUpdate or if continuing
after a rolled-back transaction. The deferred close strategy is as safe as
no Open Session in View in that respect, while still allowing for lazy loading
in views (but not providing a first-level cache for the entire request).
Looks up the SessionFactory in Spring's root web application context.
Supports a "sessionFactoryBeanName" filter init-param in web.xml;
the default bean name is "sessionFactory". Looks up the SessionFactory on each
request, to avoid initialization order issues (when using ContextLoaderServlet,
the root application context will get initialized after this filter).
NOTE: This filter will by default not flush the Hibernate Session,
as it assumes to be used in combination with service layer transactions that care
for the flushing, or HibernateAccessors with flushMode FLUSH_EAGER. If you want this
filter to flush after completed request processing, override closeSession
and invoke flush on the Session before closing it. Additionally, you will
also need to override getSession() to return a Session in a flush mode
other than the default FlushMode.NEVER. Note that getSession
and closeSession will just be invoked in single session mode!
This filter works similar to the AOP HibernateInterceptor: It just makes Hibernate Sessions available via the thread. It is suitable for non-transactional execution but also for business layer transactions via HibernateTransactionManager or JtaTransactionManager. In the latter case, Sessions pre-bound by this filter will automatically be used for the transactions and flushed accordingly.
WARNING: Applying this filter to existing logic can cause issues that have not appeared before, through the use of a single Hibernate Session for the processing of an entire request. In particular, the reassociation of persistent objects with a Hibernate Session has to occur at the very beginning of request processing, to avoid clashes with already loaded instances of the same objects.
Alternatively, turn this filter into deferred close mode, by specifying "singleSession"="false": It will not use a single session per request then, but rather let each data access operation or transaction use its own session (like without Open Session in View). Each of those sessions will be registered for deferred close, though, actually processed at request completion.
A single session per request allows for most efficient first-level caching, but can cause side effects, for example on saveOrUpdate or if continuing after a rolled-back transaction. The deferred close strategy is as safe as no Open Session in View in that respect, while still allowing for lazy loading in views (but not providing a first-level cache for the entire request).
Looks up the SessionFactory in Spring's root web application context. Supports a "sessionFactoryBeanName" filter init-param in
web.xml; the default bean name is "sessionFactory". Looks up the SessionFactory on each request, to avoid initialization order issues (when using ContextLoaderServlet, the root application context will get initialized after this filter).NOTE: This filter will by default not flush the Hibernate Session, as it assumes to be used in combination with service layer transactions that care for the flushing, or HibernateAccessors with flushMode FLUSH_EAGER. If you want this filter to flush after completed request processing, override
closeSessionand invokeflushon the Session before closing it. Additionally, you will also need to overridegetSession()to return a Session in a flush mode other than the defaultFlushMode.NEVER. Note thatgetSessionandcloseSessionwill just be invoked in single session mode!