java.lang.Objectorg.springframework.web.filter.GenericFilterBean
org.springframework.web.filter.OncePerRequestFilter
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
All Implemented Interfaces:
Filter, DisposableBean, BeanNameAware, InitializingBean, ServletContextAware
This filter makes Hibernate Sessions available via the current thread, which will be autodetected by transaction managers. It is suitable for service layer transactions via org.springframework.orm.hibernate3.HibernateTransactionManager or org.springframework.transaction.jta.JtaTransactionManager as well as for non-transactional execution (if configured appropriately).
NOTE: This filter will by default not flush the Hibernate Session,
with the flush mode set to FlushMode.NEVER
. It assumes to be used
in combination with service layer transactions that care for the flushing: The
active transaction manager will temporarily change the flush mode to
FlushMode.AUTO
during a read-write transaction, with the flush
mode reset to FlushMode.NEVER
at the end of each transaction.
If you intend to use this filter without transactions, consider changing
the default flush mode (through the "flushMode" property).
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 when
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).
Juergen
- Hoeller1.2
- Field Summary | ||
---|---|---|
public static final String | DEFAULT_SESSION_FACTORY_BEAN_NAME |
Fields inherited from org.springframework.web.filter.OncePerRequestFilter: |
---|
ALREADY_FILTERED_SUFFIX |
Fields inherited from org.springframework.web.filter.GenericFilterBean: |
---|
logger |
Method from org.springframework.orm.hibernate3.support.OpenSessionInViewFilter Summary: |
---|
closeSession, doFilterInternal, getFlushMode, getSession, getSessionFactoryBeanName, isSingleSession, lookupSessionFactory, lookupSessionFactory, setFlushMode, setSessionFactoryBeanName, setSingleSession |
Methods from org.springframework.web.filter.OncePerRequestFilter: |
---|
doFilter, doFilterInternal, getAlreadyFilteredAttributeName, shouldNotFilter |
Methods from org.springframework.web.filter.GenericFilterBean: |
---|
addRequiredProperty, afterPropertiesSet, destroy, getFilterConfig, getFilterName, getServletContext, init, initBeanWrapper, initFilterBean, setBeanName, setServletContext |
Methods from java.lang.Object: |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Method from org.springframework.orm.hibernate3.support.OpenSessionInViewFilter Detail: |
---|
Can be overridden in subclasses, e.g. for flushing the Session before closing it. See class-level javadoc for a discussion of flush handling. Note that you should also override getSession accordingly, to set the flush mode to something else than NEVER. |
|
|
The default implementation delegates to the
Can be overridden in subclasses for creating a Session with a custom entity interceptor or JDBC exception translator. |
|
|
The default implementation looks for a bean with the specified name in Spring's root application context. |
The default implementation delegates to the #lookupSessionFactory() variant without arguments. |
Can be populated with the corresponding constant name in XML bean definitions: e.g. "AUTO". The default is "MANUAL". Specify "AUTO" if you intend to use this filter without service layer transactions. |
|
If set to "false", each data access operation or transaction will 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. |