Hibernate の遅延初期化の問題:LazyInitializationException:ロールのコレクションを遅延初期化できませんでした

StackOverflow https://stackoverflow.com/questions/781751

質問

永続的なレイヤーでトランザクションを管理したいのですが、結果を怠lazにフェッチしようとすると、このエラーが発生します。

org.hibernate.LazyInitializationException:ロールのコレクションを遅延初期化できませんでした

この問題を解決するために LockMode または他の方法を使用できますか?トランザクションなしで ID でオブジェクトを見つけることはできますか?

役に立ちましたか?

解決

問題は、コンテンツにアクセスしようとしたときに Hibernate セッションがすでに閉じられていることです。Hibernate はセッションがないとコンテンツをロードできません。通常、この問題を軽減するには次の 2 つの方法があります。

  1. ページの作業が完了するまでセッションを閉じないでください。このパターンは「ビュー内のセッション」と呼ばれ、たとえばサーブレット フィルターを使用して実装できます。

  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

セッションが閉じられた後もプロパティが存在するように、プロパティを事前に取得する方法は数多くあります。

  1. 適切なゲッターを呼び出すだけです。フィールドが Bean にフェッチされた後、セッションが閉じられた後もフィールドが存在します。
  2. JPAのBean記述子で適切な属性を使用します。 @OneToMany(fetch = FetchType.EAGER), しかし、同様の休止状態の方法があります。
  3. HQL クエリでフィールドを初期化できます (HQL で機能するかどうかはわかりませんが、機能すると思います)。 FETCH INTO キーワード。

それとも、遅延ロードだけで動作しますEbean ORMのような...別のORMを使用

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top