public class OpenSessionInViewFilter extends OncePerRequestFilter
このフィルターは、トランザクションマネージャーによって自動検出される現在のスレッドを介して Hibernate セッションを利用できるようにします。これは、HibernateTransactionManager
を介したサービスレイヤートランザクション、および非トランザクション実行(適切に構成されている場合)に適しています。
注 : このフィルターは、デフォルトでは、Hibernate セッションをフラッシュせず、フラッシュモードを FlushMode.NEVER
に設定します。これは、フラッシュを処理するサービスレイヤートランザクションと組み合わせて使用することを前提としています。アクティブなトランザクションマネージャーは、読み取り / 書き込みトランザクション中にフラッシュモードを一時的に FlushMode.AUTO
に変更し、各トランザクションの最後にフラッシュモードを FlushMode.NEVER
にリセットします。
警告 : このフィルターを既存のロジックに適用すると、リクエスト全体の処理に単一の Hibernate セッションを使用することにより、これまでにない問題が発生する可能性があります。特に、永続オブジェクトと Hibernate セッションの再関連付けは、同じオブジェクトのすでにロードされているインスタンスとの衝突を避けるために、リクエスト処理の最初に行う必要があります。
Spring のルート Web アプリケーションコンテキストで SessionFactory を検索します。web.xml
で "sessionFactoryBeanName" フィルター init-param をサポートします。デフォルトの Bean 名は "sessionFactory" です。
修飾子と型 | フィールドと説明 |
---|---|
static StringSE | DEFAULT_SESSION_FACTORY_BEAN_NAME セッションファクトリに使用されるデフォルトの Bean 名。 |
ALREADY_FILTERED_SUFFIX
logger
コンストラクターと説明 |
---|
OpenSessionInViewFilter() |
修飾子と型 | メソッドと説明 |
---|---|
protected void | doFilterInternal(HttpServletRequestEE request, HttpServletResponseEE response, FilterChainEE filterChain) doFilter と同じ契約ですが、単一のリクエストスレッド内のリクエストごとに 1 回だけ呼び出されることが保証されています。 |
protected StringSE | getSessionFactoryBeanName() Spring のルートアプリケーションコンテキストから取得する SessionFactory の Bean 名を返します。 |
protected SessionFactory | lookupSessionFactory() このフィルターが使用する SessionFactory を調べます。 |
protected SessionFactory | lookupSessionFactory(HttpServletRequestEE request) 現在の HTTP リクエストを引数として、このフィルターが使用する SessionFactory を検索します。 |
protected Session | openSession(SessionFactory sessionFactory) このフィルターが使用する SessionFactory のセッションを開きます。 |
void | setSessionFactoryBeanName(StringSE sessionFactoryBeanName) SessionFactory の Bean 名を設定して、Spring のルートアプリケーションコンテキストから取得します。 |
protected boolean | shouldNotFilterAsyncDispatch() フィルターが開いた Hibernate Session を非同期でディスパッチされた各スレッドに再バインドし、最後の非同期ディスパッチまで閉じるのを延期するように、"false" を返します。 |
protected boolean | shouldNotFilterErrorDispatch() フィルターが各エラーディスパッチに Hibernate Session を提供できるように、"false" を返します。 |
doFilter, doFilterNestedErrorDispatch, getAlreadyFilteredAttributeName, isAsyncDispatch, isAsyncStarted, shouldNotFilter
addRequiredProperty, afterPropertiesSet, createEnvironment, destroy, getEnvironment, getFilterConfig, getFilterName, getServletContext, init, initBeanWrapper, initFilterBean, setBeanName, setEnvironment, setServletContext
cloneSE, equalsSE, finalizeSE, getClassSE, hashCodeSE, notifySE, notifyAllSE, toStringSE, waitSE, waitSE, waitSE
public void setSessionFactoryBeanName(StringSE sessionFactoryBeanName)
protected StringSE getSessionFactoryBeanName()
protected boolean shouldNotFilterAsyncDispatch()
Session
を非同期でディスパッチされた各スレッドに再バインドし、最後の非同期ディスパッチまで閉じるのを延期するように、"false" を返します。OncePerRequestFilter
の shouldNotFilterAsyncDispatch
protected boolean shouldNotFilterErrorDispatch()
Session
を提供できるように、"false" を返します。OncePerRequestFilter
の shouldNotFilterErrorDispatch
protected void doFilterInternal(HttpServletRequestEE request, HttpServletResponseEE response, FilterChainEE filterChain) throws ServletExceptionEE, IOExceptionSE
OncePerRequestFilter
doFilter
と同じ契約ですが、単一のリクエストスレッド内のリクエストごとに 1 回だけ呼び出されることが保証されています。詳細については、OncePerRequestFilter.shouldNotFilterAsyncDispatch()
を参照してください。デフォルトの ServletRequest および ServletResponse の代わりに、HttpServletRequest および HttpServletResponse 引数を提供します。
OncePerRequestFilter
の doFilterInternal
ServletExceptionEE
IOExceptionSE
protected SessionFactory lookupSessionFactory(HttpServletRequestEE request)
デフォルトの実装は、引数なしの lookupSessionFactory()
バリアントに委譲します。
request
- 現在のリクエスト protected SessionFactory lookupSessionFactory()
デフォルトの実装では、Spring のルートアプリケーションコンテキストで指定された名前の Bean を探します。
getSessionFactoryBeanName()
protected Session openSession(SessionFactory sessionFactory) throws DataAccessResourceFailureException
デフォルトの実装は SessionFactory.openSession()
メソッドに委譲し、Session
のフラッシュモードを "MANUAL" に設定します。
sessionFactory
- このフィルターが使用する SessionFactoryDataAccessResourceFailureException
- セッションを作成できなかった場合 FlushMode.MANUAL