Hibernate の遅延初期化の問題:LazyInitializationException:ロールのコレクションを遅延初期化できませんでした
-
13-09-2019 - |
質問
永続的なレイヤーでトランザクションを管理したいのですが、結果を怠lazにフェッチしようとすると、このエラーが発生します。
org.hibernate.LazyInitializationException:ロールのコレクションを遅延初期化できませんでした
この問題を解決するために LockMode または他の方法を使用できますか?トランザクションなしで ID でオブジェクトを見つけることはできますか?
解決
問題は、コンテンツにアクセスしようとしたときに Hibernate セッションがすでに閉じられていることです。Hibernate はセッションがないとコンテンツをロードできません。通常、この問題を軽減するには次の 2 つの方法があります。
ページの作業が完了するまでセッションを閉じないでください。このパターンは「ビュー内のセッション」と呼ばれ、たとえばサーブレット フィルターを使用して実装できます。
セッションを閉じる前に、必要なコンテンツをすべて初期化します。オブジェクト全体を初期化したい場合は、Hibernate.initialize(object) を使用できます。
編集:Hibernate ではトランザクション以外のことはできません。
他のヒント
また、休止状態からの正式な解決策で見ることができます http://www.hibernate.org/43.htmlする
一般的な問題は、オブジェクトの属性のいずれかが遅延ロードされることです。あなたができることの一つは、それはあなたのクエリにあらかじめロードされていることです。
SALEセールから どこsale.date>:たstartDate 左sale.productをフェッチ参加
このはsale.productオブジェクトをプリフェッチされます。
このサイトではより多くの情報を持っている: http://www.javalobby.org/記事/休止状態-クエリ-101 / に。
-Dave
セッションが閉じられた後もプロパティが存在するように、プロパティを事前に取得する方法は数多くあります。
- 適切なゲッターを呼び出すだけです。フィールドが Bean にフェッチされた後、セッションが閉じられた後もフィールドが存在します。
- JPAのBean記述子で適切な属性を使用します。
@OneToMany(fetch = FetchType.EAGER)
, しかし、同様の休止状態の方法があります。 - HQL クエリでフィールドを初期化できます (HQL で機能するかどうかはわかりませんが、機能すると思います)。
FETCH INTO
キーワード。
それとも、遅延ロードだけで動作しますEbean ORMのような...別のORMを使用