「ロールのコレクションの遅延初期化に失敗しました: mvc3.model.Topic.comments、セッションが存在しないか、セッションが閉じられました。」 Hibernate Exception: 総合ガイド
この例外は Hibernate 環境でよく発生し、初期化されていないファイルへのアクセスに関する問題を浮き彫りにします。 データ。このエラーを解決するには、原因を理解し、適切な解決策を見つけることが重要です。
問題の理解:
Hibernate では、データの取得に即時ロード (熱心なロード) を組み合わせて使用します。フェッチ)と遅延ロード(遅延フェッチ)。デフォルトでは、コレクションと関連付けは遅延フェッチされます。つまり、具体的に要求された場合にのみデータベースからロードされます。
指定されたシナリオでは、トピック エンティティ クラスにはコメントのコレクション (コメント フィールド) が含まれています。セッション外またはセッションが閉じられた後にこのコレクションにアクセスすると、Hibernate は「ロールのコレクションの遅延初期化に失敗しました」という例外をスローします。
コードの調査:
提供されるコードには、トピック エンティティ クラス、コントローラー (TopicController)、および JSP ビュー (details.jsp) が含まれています。 TopicController メソッド (詳細) は、ID によってトピック (Topic インスタンス) を取得し、コメント コレクション (topicById.getComments()) を取得します。このコレクションは、JSP ビューに渡されます。
JSP ビューの分析:
JSP ビューは、JSTL c:forEach ループを使用して、コメント コレクションを反復処理します。この行は項目を項目として参照します:
<c:forEach items="${commentList}" var="item">
例外の原因:
コメント コレクションがまだ初期化されていないために例外が発生します。 JSP ビューは Hibernate セッションの外側にあるため、コレクションにアクセスしようとすると「ロールのコレクションの遅延初期化に失敗しました」エラーが発生します。
解決策: Eager Fetching
この例外を解決するには、積極的なフェッチを使用できます。これには、トピックがデータベースから取得されるときに、トピックとともにコメント コレクションをロードすることが含まれます。 Topic エンティティ クラスで、コメント フィールドを次のように変更します。
@OneToMany(fetch = FetchType.EAGER, mappedBy = "topic", cascade = CascadeType.ALL) private Collection<Comment> comments = new LinkedHashSet<Comment>();
これにより、Hibernate はトピックがロードされるとすぐにコメント コレクションをフェッチします。これにより、遅延初期化の必要性がなくなり、例外が解決されます。
Eager Fetching の代替案:
場合によっては、Eager Fetching が推奨される解決策ではない可能性があります。必要以上に多くのデータをロードすることにより、パフォーマンスが低下する可能性があります。代替案には次のものがあります:
遅延読み込みと意味:
遅延ロードは、必要な場合にのみデータをロードすることでパフォーマンスを向上させるように設計された機能です。ただし、初期化のためにセッションが開いている必要があります。セッションが閉じられているか開かれていない場合、初期化されていないコレクションにアクセスすると、「コレクションの遅延初期化に失敗しました」という例外が発生します。
以上がHibernate 例外「ロールのコレクションの遅延初期化に失敗しました」を解決する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。