1

永続化レイヤーでトランザクションを管理したいのですが、結果を遅延取得しようとすると、次のエラーが発生します。

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

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

4

5 に答える 5

3

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

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

  2. セッションを閉じる前に、必要なすべてのコンテンツを初期化してください。オブジェクト全体を初期化したい場合は、Hibernate.initialize(object) を使用できます。

編集: Hibernate では、トランザクション以外では何もできません。

于 2009-04-23T13:58:39.410 に答える
2

http://www.hibernate.org/43.htmlで hibernate の公式ソリューションを見ることもでき ます。

于 2009-04-23T17:06:14.753 に答える
0

Or just use another ORM ... like Ebean ORM where lazy loading just works :)

于 2009-11-11T11:04:53.247 に答える
0

通常、問題は、オブジェクトの属性の1つが遅延ロードされることです。実行できることの1つは、クエリにプリロードすることです。

セールセールからsale.date>:startDateが参加してフェッチsale.productに参加

これにより、sale.productオブジェクトがプリフェッチされます。

このサイトには詳細情報があります:http ://www.javalobby.org/articles/hibernate-query-101/ 。

-デイブ

于 2009-04-23T14:20:57.050 に答える
0

プロパティをプリフェッチするには多くの方法があるため、セッションが閉じられた後も存在します。

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