クラス OpenSessionInViewInterceptor
- 実装されたすべてのインターフェース:
AsyncWebRequestInterceptor
,WebRequestInterceptor
Session
をスレッドにバインドする Spring Web リクエストインターセプター。このクラスは、"Open Session in View" パターンの具体的な表現です。これは、元のトランザクションがすでに完了しているにもかかわらず、Web ビューで関連付けの遅延読み込みを可能にするパターンです。
このインターセプターは、トランザクションマネージャーによって自動検出される現在のスレッドを介して Hibernate セッションを利用できるようにします。これは、HibernateTransactionManager
を介したサービスレイヤートランザクション、および非トランザクション実行(適切に構成されている場合)に適しています。
OpenSessionInViewFilter
とは異なり、このインターセプターは Spring アプリケーションコンテキストで構成されているため、Bean 接続を利用できます。
警告 : このインターセプターを既存のロジックに適用すると、リクエスト全体の処理に単一の Hibernate Session
を使用することにより、これまでにない問題が発生する可能性があります。特に、永続オブジェクトと Hibernate Session
の再関連付けは、同じオブジェクトのすでにロードされているインスタンスとの衝突を避けるために、リクエスト処理の最初に行う必要があります。
フィールドサマリー
コンストラクターのサマリー
メソッドのサマリー
修飾子と型メソッド説明void
afterCompletion
(WebRequest request, ExceptionSE ex) HibernateSession
をスレッドからバインド解除し、閉じます。void
afterConcurrentHandlingStarted
(WebRequest request) ハンドラーがリクエストを同時に処理し始めたときに、postHandle
およびafterCompletion
の代わりに呼び出されます。protected StringSE
リクエストがすでにインターセプトされていることを識別するリクエスト属性の名前を返します。Hibernate セッションの作成に使用する Hibernate SessionFactory を返します。protected Session
このインターセプターが使用する SessionFactory のセッションを開きます。void
postHandle
(WebRequest request, ModelMap model) 呼び出しが成功した後、ビューのレンダリングの前に(もしあれば)リクエストハンドラーの実行をインターセプトします。void
preHandle
(WebRequest request) 新しい HibernateSession
を開き、TransactionSynchronizationManager
を介してスレッドにバインドします。void
setSessionFactory
(SessionFactory sessionFactory) Hibernate セッションの作成に使用する Hibernate SessionFactory を設定します。
フィールドの詳細
PARTICIPATE_SUFFIX
「既存のセッション処理に参加する」リクエスト属性のSessionFactory
toString()
表現に追加されるサフィックス。logger
コンストラクターの詳細
OpenSessionInViewInterceptor
public OpenSessionInViewInterceptor()
メソッドの詳細
setSessionFactory
Hibernate セッションの作成に使用する Hibernate SessionFactory を設定します。getSessionFactory
Hibernate セッションの作成に使用する Hibernate SessionFactory を返します。preHandle
新しい HibernateSession
を開き、TransactionSynchronizationManager
を介してスレッドにバインドします。- 次で指定:
- インターフェース
WebRequestInterceptor
のpreHandle
- パラメーター:
request
- 現在の Web リクエスト- 例外:
DataAccessException
postHandle
インターフェースからコピーされた説明:WebRequestInterceptor
呼び出しが成功した後、ビューのレンダリングの前に(もしあれば)リクエストハンドラーの実行をインターセプトします。ハンドラーの実行が成功した後にコンテキストリソースを変更することができます(たとえば、Hibernate セッションのフラッシュ)。
- 次で指定:
- インターフェース
WebRequestInterceptor
のpostHandle
- パラメーター:
request
- 現在の Web リクエストmodel
- ビューに公開されるモデルオブジェクトのマップ(null
の場合があります)。必要に応じて、公開されたモデルの分析やモデル属性の追加に使用できます。
afterCompletion
public void afterCompletion(WebRequest request, @Nullable ExceptionSE ex) throws DataAccessException HibernateSession
をスレッドからバインド解除し、閉じます。- 次で指定:
- インターフェース
WebRequestInterceptor
のafterCompletion
- パラメーター:
request
- 現在の Web リクエストex
- ハンドラーの実行時にスローされる例外(ある場合)- 例外:
DataAccessException
- 関連事項:
afterConcurrentHandlingStarted
インターフェースからコピーされた説明:AsyncWebRequestInterceptor
ハンドラーがリクエストを同時に処理し始めたときに、postHandle
およびafterCompletion
の代わりに呼び出されます。- 次で指定:
- インターフェース
AsyncWebRequestInterceptor
のafterConcurrentHandlingStarted
- パラメーター:
request
- 現在のリクエスト
openSession
このインターセプターが使用する SessionFactory のセッションを開きます。デフォルトの実装は
SessionFactory.openSession()
メソッドに委譲し、Session
のフラッシュモードを "MANUAL" に設定します。- 戻り値:
- 使用するセッション
- 例外:
DataAccessResourceFailureException
- セッションを作成できなかった場合- 関連事項:
getParticipateAttributeName
リクエストがすでにインターセプトされていることを識別するリクエスト属性の名前を返します。デフォルトの実装では、
SessionFactory
インスタンスのtoString()
表現を受け取り、PARTICIPATE_SUFFIX
を追加します。