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 サイトの他の関連記事を参照してください。