JPA と Hibernate の N 1 問題への対処
JPA と Hibernate では、複数のクエリが実行されると N 1 クエリの問題が発生します。関連データを取得するため、データのフェッチが非効率になります。この問題を解決するために、Hibernate はさまざまなテクニックを提供しています。
N 1 問題を理解する
この問題は、最初のクエリがプライマリ エンティティを取得し、後続のクエリがトリガーされるときに発生します。関連データを取得します。たとえば、関連する Post エンティティをプリフェッチせずに PostComment エンティティをフェッチすると、Hibernate はアクセスされた Post インスタンスごとに追加のクエリを実行するようになります。
Hibernate のソリューション
1.結合フェッチ:
「結合フェッチ」戦略を利用すると、単一のクエリで主エンティティと一緒に関連データを取得できます。この例では、
List<PostComment> comments = entityManager.createQuery("select pc from PostComment pc join fetch pc.post where pc.review = :review", PostComment.class) .setParameter("review", review) .getResultList();
2 を使用できます。コレクションのプリフェッチ:
プライマリ エンティティのコレクションと関連データの追加コレクションをフェッチするときは、後者をプリフェッチすることをお勧めします。 1 つのオプションは、最初のクエリでコレクションをプリフェッチすることです:
List<PostComment> comments = entityManager.createQuery("select pc from PostComment pc join fetch pc.post where pc.review = :review", PostComment.class) .setParameter("review", review) .getResultList(); ListpostTags = entityManager.createQuery("select pt from PostTag pt where pt.post in (:commentPosts)", PostTag.class) .setParameter("commentPosts", comments) .getResultList();
3。セカンダリ クエリ:
プリフェッチが効率的でない場合、または複数の子関連付けをフェッチする必要がある場合は、セカンダリ クエリ戦略を使用できます。基本クエリでプライマリ エンティティを取得し、後続のクエリを使用して関連データを取得します。
db-util による自動検出
db-util ライブラリは、自動化とは、N 1 クエリの問題を検出することを意味します。 JUnit アサートを使用すると、生成される SQL ステートメントの予想数を検証し、開発プロセスの早い段階で問題を発見できます。
以上がJPA と Hibernate での N 1 クエリの問題にどのように対処できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。