JPA と Hibernate の N 1 問題に効果的に取り組む
N 1 クエリの問題は、最初のクエリが N レコードを取得し、その後クエリが実行され、これらの N 個のレコードごとに関連するリレーショナル レコードが取得されます。 Hibernate でこの問題を解決するには、包括的なアプローチが必要です。
問題の理解
N 1 クエリの問題は、関連付けられた関係を初期化せずにレコードをフェッチすると発生します。後でその関係にアクセスしようとすると、Hibernate は追加のクエリを実行して必要な情報を取得します。この結果、単一のクエリではなく N 1 個のクエリが実行されます。
問題の解決
Hibernate でこの問題を解決するには、JOIN FETCH を使用する効果的な解決策が必要です。句。この句を最初のクエリに追加すると、問題の原因となっている関係を積極的にフェッチできます。
List<PostComment> comments = entityManager.createQuery( "select pc from PostComment pc join fetch pc.post p where pc.review = :review", PostComment.class) .setParameter("review", review) .getResultList();
複数の子の関連付けをフェッチする必要がある場合は、プライマリ クエリで 1 つのコレクションをフェッチし、残りは別のクエリで。
自動化検出
N 1 クエリの問題をシームレスに検出するには、自動 JUnit アサーションを統合テストに組み込むことを強くお勧めします。 db-util のようなツールは、生成された SQL ステートメントの数を検証するためのオープンソース ユーティリティを提供し、コードが知らず知らずのうちにこのパフォーマンスのボトルネックに悩まされることを防ぎます。
以上がJPA と Hibernate で N 1 問題に効果的に対処するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。