ホームページ > Java > &#&チュートリアル > Hibernate が「コレクションの遅延初期化に失敗しました」例外をスローするのはなぜですか?それを修正するにはどうすればよいですか?

Hibernate が「コレクションの遅延初期化に失敗しました」例外をスローするのはなぜですか?それを修正するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-02 22:16:11
オリジナル
474 人が閲覧しました

Why Does Hibernate Throw a

Hibernate の「コレクションの遅延初期化に失敗しました」例外について理解する

Hibernate のコンテキストでは、「コレクションの遅延初期化に失敗しました」 " 実行中に適切にフェッチされなかったデタッチされたエンティティのコレクション プロパティにアクセスしようとすると、例外が発生します。元のクエリ。このエラーは通常、Hibernate セッションのスコープ外のコレクションにアクセスするとき、多くの場合ビュー処理中に発生します。

この問題を解決するには、トピックとコメントの間のモデル関係を調べる必要があります。トピック モデルのコメント コレクションは、デフォルトで遅延初期化としてマークされます。これは、トピック エンティティがデータベースから取得されるときに、コレクションがメモリにロードされないことを意味します。代わりに、コレクションが実際にアクセスされたときにのみロードされます。

コレクションは遅延初期化されるため、Topic エンティティが Hibernate セッションから切り離されるとアクセスできなくなります。この特定のシナリオでは、制御フローがコントローラー (TopicController) から JSP ビュー (/topic/details) に移動するときにトピック エンティティが切り離され、例外が発生します。

エラーを修正するには、コメントコレクションはクエリ中に積極的にフェッチできます。これは、@OneToMany アノテーションでフェッチ タイプを LAZY から EAGER に変更することで実現できます。

@OneToMany(fetch = FetchType.EAGER, mappedBy = "topic", cascade = CascadeType.ALL)
private Collection<Comment> comments = new LinkedHashSet<Comment>();
ログイン後にコピー

フェッチ タイプを EAGER に設定すると、Topic エンティティが取得されるときにコレクションがすぐにメモリにロードされます。データベースから取得し、Hibernate セッション外でも常にアクセスできるようにします。

以上がHibernate が「コレクションの遅延初期化に失敗しました」例外をスローするのはなぜですか?それを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート