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