LazyInitializationException: メソッド呼び出しからプロキシにアクセスできません
「LazyInitializationException: プロキシを初期化できませんでした - セッションがありません」エラーが発生した場合、通常は次のことを示しますHibernate アプリケーション内の遅延ロードの問題。この例外は、アクティブな Hibernate セッションの境界外で、遅延初期化されたエンティティ (関連オブジェクトやコレクションなど) にアクセスしようとしたときに発生します。
この問題は、遅延初期化されたエンティティと対話しようとしたときに発生します。まず Hibernate セッションを確立します。 Hibernate は、遅延ロードと呼ばれるメカニズムを利用して、関連付けられたオブジェクトまたはコレクションのロードを、明示的に要求されるまで延期することでパフォーマンスを向上させます。
この例外を克服するには、いくつかのアプローチを実装できます。
Spring の @Transactional の使用注釈:
以下に示すように、遅延ロードされたエンティティにアクセスするメソッドに @Transactional の注釈を付けます。
@Transactional public Model getModelByModelGroup(int modelGroupId) { // Hibernate session will be managed by Spring automatically }
このソリューションは Spring のトランザクション管理を利用し、メソッドで次のことを可能にします。アクティブな Hibernate セッションにアクセスできます。ただし、明示的な保存呼び出しがなくても、エンティティの更新は自動的に保持されることに注意してください。
セッションを手動で初期化する:
遅延ロードされたエンティティ。SessionFactoryHelper クラスまたは Hibernate のクラスを使用して Hibernate セッションを手動で開閉します。 API:
Session session = SessionFactoryHelper.getSessionFactory().openSession(); session.beginTransaction(); try { // Access and manipulate lazily loaded entity } catch (Exception ex) { // Handle exception } finally { session.getTransaction().commit(); session.close(); }
エンティティの積極的な読み込み:
特定のエンティティまたはその関連付けの遅延読み込みを無効にし、Hibernate にエンティティとその関連オブジェクトを即座に:
@Entity @Table(name = "model") public class Model { // ... @ManyToOne(fetch = FetchType.EAGER) private ModelGroup modelGroup; // ... }
このアプローチによりパフォーマンスが向上します遅延ロードされたエンティティが現在のコンテキストで常に必要な場合。ただし、エンティティが常に必要なわけではない場合は、パフォーマンスの低下につながる可能性があります。
これらのソリューションのいずれかを実装すると、「LazyInitializationException」を軽減し、Hibernate の遅延読み込みを適切に管理できます。メカニズム。
以上がHibernate で LazyInitializationException を解決する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。