Wir haben ein paar Entitäten mit einer Reihe von Eigenschaften, die mit Hibernates @Formula
Annotation versehen sind. Die SQL-Snippets in den Annotationen führen hauptsächlich skalare Unterabfragen durch (z. B. COUNT
Abfragen). Als Beispiel haben wir eine 1: n-Beziehungshierarchie, die vier Ebenen tief ist: A <- B <- C <- D
(wobei <-
eine Eins-zu-viele-Verknüpfung markiert). Sehr oft möchten wir beim Abrufen einer Entität vom Typ A
die Anzahl der verknüpften Entitäten vom Typ D
wissen. Dafür verwenden wir eine @Formula
-annotierte Eigenschaft in A
.Lazy/Eager-Laden von @Formula-Spalten dynamisch steuern
Da wir diese Werte nicht jedes Mal benötigen, haben wir die @Formula
Eigenschaften als lazy-loaded deklariert (wir haben die Bytecode-Erweiterung von Hibernate aktiviert, um dies zu ermöglichen). Bei einigen Abfragen möchten wir diese Eigenschaften gerne laden. Wir laden oft Hunderte von Entitäten vom Typ A
in einer Abfrage, und es wäre leistungsmäßig wichtig, das Eager/Lazy-Laden dieser Eigenschaften dynamisch zu steuern. Wir verwenden bereits die Entity-Graphen von JPA, um zu steuern, welche Eigenschaften für bestimmte Abfragen geladen werden, aber Entity-Graphen scheinen hier nicht zu funktionieren. Selbst wenn wir die Eigenschaften @Formula
im Entity-Diagramm auflisten, werden sie immer noch träge geladen.
Ist es möglich, das faule/eifrige Laden von @Formula
Spalten dynamisch pro Abfrage zu steuern? Wir sind derzeit auf die JPA Criteria Query API beschränkt, und benannte Abfragen sind hier nicht möglich.
Update:
Die Eigenschaften in Frage sind nicht Vereinigungen zu anderen Einrichtungen, aber nur einige berechneten Werte. Dies bedeutet, dass z.B. Fetch-Profile gelten hier nicht, da sie nur auf Entity-Assoziationen anwendbar sind (oder zumindest habe ich die Hibernate manual verstanden). Hier ist ein Beispiel von einem unserer @Formula
Eigenschaften:
@Entity
public class A {
@Basic(fetch = FetchType.LAZY)
@Formula("(select count(*) from entity_D_table where ...)")
private int associatedDCount;
...
}
Aber sind die Abrufprofile nicht nur auf Entitätszuordnungen anwendbar? Ich habe ein Codebeispiel hinzugefügt, wie unsere Eigenschaften aussehen. Ich glaube nicht, dass die Abrufprofile hier funktionieren würden. –
Sie haben Recht. Könnten Sie in Erwägung ziehen, eine SQL-Sicht in Ihrer DB zu definieren und eine neue Entität darauf abzubilden, um die Formel eifrig als einfache Eigenschaft zu holen? –
Ich habe überlegt, eine Ansicht zu erstellen, aber das würde ziemlich viele Änderungen in der Codebasis erfordern. Momentan verwenden wir die JPA-Entity-Graphen, um Daten aus etwa einem Dutzend Tabellen auf einmal zu laden, und der Code erwartet, dass er das gesamte Entity-Diagramm erhält. Aber wenn der derzeitige Ansatz im Benchmarking zu langsam ist, müssen wir darüber erneut nachdenken. –