LazyInitializationException を回避するための Hibernate セッションの管理
「org.hibernate.LazyInitializationException: プロキシを初期化できませんでした - セッションがありません」エラーは、次の場合によく発生します。 Hibernate セッションのスコープ外で遅延初期化されたエンティティにアクセスする。この記事では、遅延読み込み構成を変更せずに解決策を検討することで、この問題に対処します。
問題
提供されたコード スニペットでは、getModelByModelGroup メソッドが最初は適切なセッションなしで実装されていました。処理が行われ、例外が発生します。セッションを制御してトランザクションを手動で開始しようとしても、エラーを解決できませんでした。
推奨される解決策
この問題を回避するには、次のようなさまざまなアプローチが考えられます。
getModelByModelGroup メソッドを含むクラスに @Transactional のアノテーションを付けます。 Spring はセッション処理を自動的に管理するため、手動でセッションとトランザクションを制御する必要がなくなります。これにより、メソッドがトランザクション内で確実に実行され、遅延初期化例外が防止されます。
@Transactional public class MyClass { public Model getModelByModelGroup(int modelGroupId) { ... } }
手動で作成getModelByModelGroup メソッドのスコープ内で Hibernate セッションを閉じます。これによりセッション管理を明示的に制御できますが、リソース リークを避けるために慎重な取り扱いが必要です。
public Model getModelByModelGroup(int modelGroupId) { Session session = SessionFactoryHelper.getSessionFactory().openSession(); try (session) { // using Java 9+ syntax // perform database operations } catch (Exception ex) { // handle exception } }
アプリケーション アーキテクチャを使用して、Hibernate セッションと遅延初期化されたエンティティを管理するスコープ付きキャッシュまたはデータ アクセス オブジェクト パターンを作成します。これにより、手動セッション処理の必要性が減ります。
追加メモ
以上が遅延読み込みを無効にせずに Hibernate の LazyInitializationException を防ぐ方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。