hibernate
Leistungsoptimierung
Suche…
Verwenden Sie keinen EAGER-Abruftyp
Der Ruhezustand kann zwei Arten des Abrufs verwenden, wenn Sie die Beziehung zwischen zwei Entitäten EAGER
: EAGER
und LAZY
.
Im Allgemeinen ist der EAGER
keine gute Idee, da er JPA EAGER
, die Daten immer abzurufen, selbst wenn diese Daten nicht erforderlich sind.
Beispiel: Wenn Sie eine Person
und die Beziehung zu Address
wie Address
lautet:
@Entity
public class Person {
@OneToMany(mappedBy="address", fetch=FetchType.EAGER)
private List<Address> addresses;
}
Jedes Mal, wenn Sie eine Person
abfragen, wird auch die Liste der Address
dieser Person
zurückgegeben.
Anstatt also Ihre Entität zuzuordnen mit:
@ManyToMany(mappedBy="address", fetch=FetchType.EAGER)
Benutzen:
@ManyToMany(mappedBy="address", fetch=FetchType.LAZY)
Eine andere Sache, die zu beachten ist, ist die Beziehung @OneToOne
und @ManyToOne
. Beide sind standardmäßig EAGER. Wenn Sie sich also Gedanken über die Leistung Ihrer Anwendung machen, müssen Sie den Abruf für diese Art von Beziehung festlegen:
@ManyToOne(fetch=FetchType.LAZY)
Und:
@OneToOne(fetch=FetchType.LAZY)
Verwenden Sie Komposition statt Vererbung
Der Winterschlaf hat einige Vererbungsstrategien. Der JOINED
Vererbungstyp führt einen JOIN zwischen der JOINED
Entität und der übergeordneten Entität durch.
Das Problem bei diesem Ansatz besteht darin, dass der Ruhezustand immer die Daten aller beteiligten Tabellen in die Vererbung einbringt.
Wenn Sie beispielsweise die Entitäten Bicycle
und MountainBike
mit dem Vererbungstyp JOINED
verwenden:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Bicycle {
}
Und:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class MountainBike extends Bicycle {
}
Jede JPQL-Abfrage, die auf MountainBike
trifft, liefert die Bicycle
und erstellt eine SQL-Abfrage wie:
select mb.*, b.* from MountainBike mb JOIN Bicycle b ON b.id = mb.id WHERE ...
Wenn Sie ein anderes übergeordnetes Bicycle
für das Bicycle
(z. B. " Transport
), werden bei dieser obigen Abfrage auch die Daten dieses übergeordneten Elements abgerufen und ein zusätzlicher JOIN durchgeführt.
Wie Sie sehen, ist dies auch eine Art EAGER
Mapping. Sie haben nicht die Wahl, nur die Daten der MountainBike
Tabelle mit dieser Vererbungsstrategie mitzubringen.
Das Beste für die Leistung ist Komposition statt Vererbung.
Um dies zu erreichen, können Sie die MountainBike
Entität einem Feldfahrrad bicycle
:
@Entity
public class MountainBike {
@OneToOne(fetchType = FetchType.LAZY)
private Bicycle bicycle;
}
Und Bicycle
:
@Entity
public class Bicycle {
}
Jede Abfrage bringt jetzt standardmäßig nur die MountainBike
Daten mit.