Behebung des N 1-Problems in JPA und Hibernate
In JPA und Hibernate tritt ein N 1-Abfrageproblem auf, wenn mehrere Abfragen ausgeführt werden Abrufen verwandter Daten, was zu einem ineffizienten Datenabruf führt. Um dieses Problem zu lösen, bietet Hibernate eine Reihe von Techniken an.
Das N 1-Problem verstehen
Das Problem tritt auf, wenn eine erste Abfrage primäre Entitäten abruft und nachfolgende Abfragen ausgelöst werden um verwandte Daten abzurufen. Wenn Sie beispielsweise PostComment-Entitäten abrufen, ohne die zugehörige Post-Entität vorab abzurufen, wird Hibernate gezwungen, zusätzliche Abfragen für jede aufgerufene Post-Instanz auszuführen.
Lösung in Hibernate
1. Join-Abruf:
Durch die Verwendung der „Join-Abruf“-Strategie können die zugehörigen Daten zusammen mit den primären Entitäten in einer einzigen Abfrage abgerufen werden. In unserem Beispiel können wir verwenden:
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. Sammlungs-Vorabruf:
Beim Abrufen einer Sammlung primärer Entitäten und einer zusätzlichen Sammlung verwandter Daten ist es ratsam, letztere vorab abzurufen. Eine Möglichkeit besteht darin, die Sammlung in der ersten Abfrage vorab abzurufen:
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. Sekundäre Abfrage:
In Fällen, in denen der Vorabruf nicht effizient ist oder mehrere untergeordnete Zuordnungen abgerufen werden müssen, kann eine sekundäre Abfragestrategie eingesetzt werden. Rufen Sie die primären Entitäten mit einer Basisabfrage ab und verwenden Sie eine nachfolgende Abfrage, um die zugehörigen Daten abzurufen.
Automatische Erkennung mit db-util
Die db-util-Bibliothek bietet eine Automatisierte Mittel zur Erkennung des N1-Abfrageproblems. JUnit-Asserts können verwendet werden, um die erwartete Anzahl generierter SQL-Anweisungen zu validieren und so das Problem frühzeitig im Entwicklungsprozess zu erkennen.
Das obige ist der detaillierte Inhalt vonWie können Sie das N 1-Abfrageproblem in JPA und Hibernate beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!