In diesem Link, den ich zuvor im Kommentar erwähnt habe, lesen Sie diesen Teil:
Mit einem "Abruf" -Verbindungspunkt können Zuordnungen oder Auflistungen von Werten zusammen mit ihren übergeordneten Objekten mit einer einzigen Auswahl initialisiert werden. Dies ist besonders nützlich bei einer Sammlung. Es überschreibt effektiv die äußeren Verknüpfungen und verzögerten Deklarationen der Zuordnungsdatei für Zuordnungen und Sammlungen.
Dieser "JOIN FETCH" hat seine Wirkung, wenn Sie die Eigenschaft (fetch = FetchType.LAZY) für eine Sammlung innerhalb einer Entität haben (Beispiel unten).
Und es ist nur die Methode "wann die Abfrage erfolgen soll". Und Sie müssen auch wissen , diese :
Im Ruhezustand gibt es zwei orthogonale Begriffe: Wann und wie wird die Zuordnung abgerufen? Es ist wichtig, dass Sie sie nicht verwechseln. Wir verwenden Fetch, um die Leistung zu optimieren. Wir können Lazy verwenden, um einen Vertrag für die Daten zu definieren, die in einer getrennten Instanz einer bestimmten Klasse immer verfügbar sind.
Wann wird die Zuordnung abgerufen -> Ihr Typ "FETCH"
wie wird es abgerufen -> Join / select / Subselect / Batch
In Ihrem Fall hat FETCH nur dann eine Wirkung, wenn Sie eine Abteilung als Set in Employee haben, etwa so in der Entität:
@OneToMany(fetch = FetchType.LAZY)
private Set<Department> department;
wenn Sie verwenden
FROM Employee emp
JOIN FETCH emp.department dep
du wirst bekommen emp
und emp.dep
. Wenn Sie Fetch nicht verwendet haben, können Sie immer noch abrufen, emp.dep
aber der Ruhezustand verarbeitet eine weitere Auswahl in der Datenbank, um diese Abteilung zu erhalten.
Es handelt sich also nur um eine Leistungsoptimierung. Sie möchten alle Ergebnisse (Sie benötigen sie oder nicht) in einer einzigen Abfrage erhalten (eifriges Abrufen) oder Sie möchten sie später abfragen, wenn Sie sie benötigen (verzögertes Abrufen).
Verwenden Sie eifriges Abrufen, wenn Sie kleine Daten mit einer Auswahl (einer großen Abfrage) abrufen möchten. Oder verwenden Sie Lazy Fetching, um abzufragen, was Sie letzteres benötigen (viele kleinere Abfragen).
Verwenden Sie fetch, wenn:
Keine große nicht benötigte Sammlung / Menge innerhalb der Entität, die Sie erhalten möchten
Kommunikation vom Anwendungsserver zum Datenbankserver zu weit und dauert lange
Möglicherweise benötigen Sie diese Sammlung, wenn Sie keinen Zugriff darauf haben ( außerhalb der Transaktionsmethode / -klasse).