OpenSessionInView パターンを使用する以外に、Hibernate Web アプリケーションで LazyInitializationExceptions を回避する方法はありますか? OpenSessionInView を使用することの欠点はありますか?
4 に答える
Web アプリケーションで作業する場合、通常、ビュー ページで必要なオブジェクト/フィールドを事前に決定し、ビューにディスパッチする前にすべてのオブジェクトがモデルから適切に初期化されていることを確認します。
これは、(少なくとも) 3 つの方法で実現できます。
- 熱心な戦略を使用してプロパティをフェッチする (つまり、 Criteria API
FetchMode.JOIN
を使用している場合は を使用) - 明示的なプロパティの初期化 (つまり を使用
Hibernate.initialize(property)
) - 適切なプロパティ アクセサーを呼び出してプロパティを暗黙的に初期化する
OpenSessionInView の欠点については、こちらのページをご覧になりましたか?
通常、熱心なフェッチを行うというグローバルな決定を行わずに、問題を処理する最良の方法です。hqlクエリと組み合わせて「fetch」キーワードを使用することです。
http://www.hibernate.org/hib_docs/reference/en/html/queryhql-joins.htmlから
さらに、「フェッチ」結合を使用すると、単一の選択を使用して、関連付けまたは値のコレクションをその親オブジェクトとともに初期化できます。これは、コレクションの場合に特に役立ちます。アソシエーションとコレクションのマッピング ファイルの外部結合と遅延宣言を効果的にオーバーライドします。詳細については、セクション19.1「フェッチ戦略」を参照してください。
from Cat as cat inner join fetch cat.mate left join fetch cat.kittens
JBoss Seam に切り替えます。
Seam フレームワークは、Hibernate を開発した人たちによってうまく設計されています。
View でセッションを開く場合でも、問題が発生する場合があります。Web アプリケーションの複雑さによっては、Open Session In View がすべてのケースを処理できるわけではありません。メールの送信などの Quartz ジョブ中にエンティティをフェッチするのと同様に (UI で) データを表示する際に問題がありました。
Hibernate はすでにインテリジェントにデータをフェッチしており、フェッチ モードを変更するとパフォーマンスが低下します。それだけでなく、あなたは慣習から離れており、関係のない構成の詳細でプロジェクトをめちゃくちゃにするでしょう.
ウォルター