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!