2011-11-28 1 views
3

org.hibernate.LazyInitializationException:役割のコレクションを遅延して初期化できませんでした:pojo.Person.address、セッションもセッションも閉じられませんでした。org.hibernate.lazyinitialization例外

この例外が発生しています。私はSpring 3.0とHibernate 3.6を使用しています。

+5

残念ながら、あなたが同じエラーを再現してここに投稿する、小さくて簡潔な例を準備しない限り、誰も助けてくれることはありません。 – alf

+0

デフォルトでは、休止状態でロード・コレクションを追加すると、コレクションがロードされず、プロキシ・オブジェクトが戻され、セッションがクローズした後にコレクションにアクセスしようとしている可能性があります。 –

答えて

7

遅れてロードされたマップされたアドレスコレクションを持つPersonというエンティティがあるようですか? Personをロードし、ロードされたセッションが閉じられました。

セッションが閉じられた後、そのアドレスのコレクションにアクセスしようとしましたが、Hibernateはそれらをロードしようとしました。ただし、元のセッションが使用できなくなった場合は、これは不可能です。

  1. 使用OpenSessionInViewパターン「Hibernateのセッションはあなたので(要求/応答サイクルの期間中に開いたままであることを確実にするために:あなたは、いくつかのオプションを持っているアドレスプロパティにアクセスするために

    veタグの付いたSpring MVCこれはWebベースの操作だと仮定します)。これは本質的にあなたのHibernateセッションをHTTP要求にスコープします。

  2. セッションが閉じられる(トランザクションがコミットされる)前に、必要なすべてのプロパティがロードされていることを確認してください。あなたは左を使用して、この使用

    のHibernate.initialize(person.addressで)

またはHQLを書き込むことによってフェッチ参加行うことができます。

createQuery("from Person as person left join fetch person.address") 

これは、このクエリの遅延ロード設定のみを上書きし、すべてのコレクションが確実に初期化されるようにします。

+0

Alex、FetchType.EAGERと同等だとは思わない?そしてそれはパフォーマンスを低下させます。 –

+0

しかし、これを熱心に取り出す必要があります。そうしないと、LazyInitializationExceptionsが発生します。あなたが見たのはまさにこれです!このコレクションをロードする必要がありますので、セッションを閉じる前に行うこともできます。左側の結合フェッチを使用することの美しさは、マッピングにFetchType.Lazyを指定できることです。これは、アドレスコレクションにアクセスする必要がないことがわかっているときに、ほとんどの場合に使用されます。しかし、コレクションにアクセスする必要があることがわかったら、遅延マッピングをオーバーライドすることができます!それを手に入れますか? –

+0

表示されている例外は、アドレスプロパティにアクセスしようとしたことを示しています。したがって、ある時点でロードする必要があります。パフォーマンスのオーバーヘッドがなくても、あなたのセッションには魔法のように表示されません。それだけでいいですね。 –

3

おそらく、トランザクション管理を設定していない可能性があります。つまり、Springはデフォルトのトランザクションスコープを使用します。これはHibernateTemplateコールごとのトランザクションで、HibernateTemplateからの戻りの直後にセッションを閉じます。あなたが必要とする詳細をプリフェッチするために、明示的なセッション処理にトランザクションを設定

  1. スイッチ、
  2. 使用基準のAPIやfetch join:あなたは3つのいずれかを行うことができます

+0

クイック返信用のThanx alf。第3の選択肢を説明できますか?つまり、基準apiまたはフェッチ結合を使用します。実際には私はhbm.xmlのpojosを含む既存のプロジェクトを持っており、注釈付きのpojosに変換されます。 –

+0

怠け者にしないでください。 http://docs.jboss.org/hibernate/core/3.3/reference/en/html/querycriteria.htmlとhttp://community.jboss.org/wiki/AShortPrimerOnFetchingStrategiesから始めることができます。 – alf

0

@Transactionalというサービスのメソッドに注釈付けできなかったため、この問題が発生しました。呼び出し元に適切な注釈が付けられていない限り、別のメソッドへの呼び出しが(同じクラス内であっても)呼び出されたとき、Hibernateはセッションを閉じているようです。

関連する問題