w tym linku wspomniałem wcześniej w komentarzu, przeczytaj tę część:
Łączenie „pobierania” umożliwia zainicjowanie asocjacji lub kolekcji wartości wraz z ich obiektami nadrzędnymi za pomocą pojedynczego wyboru. Jest to szczególnie przydatne w przypadku kolekcji. Skutecznie zastępuje sprzężenia zewnętrzne i leniwe deklaracje pliku mapowania dla skojarzeń i kolekcji.
to "JOIN FETCH" będzie miało skutek, jeśli masz (fetch = FetchType.LAZY) właściwość dla kolekcji wewnątrz encji (przykład poniżej).
I ma to wpływ tylko na metodę „kiedy zapytanie powinno się wydarzyć”. Musisz też wiedzieć, że :
hibernacja ma dwa ortogonalne pojęcia: kiedy jest pobierana asocjacja i jak jest pobierana. Ważne jest, aby ich nie mylić. Używamy pobierania do dostrajania wydajności. Możemy użyć leniwego, aby zdefiniować kontrakt, dla którego dane są zawsze dostępne w dowolnej odłączonej instancji określonej klasy.
kiedy jest pobierane skojarzenie -> Twój typ „FETCH”
jak jest pobierany -> Dołącz / wybierz / Subselect / Batch
W twoim przypadku FETCH odniesie skutek tylko wtedy, gdy masz dział jako zestaw wewnątrz pracownika, coś takiego w encji:
@OneToMany(fetch = FetchType.LAZY)
private Set<Department> department;
kiedy używasz
FROM Employee emp
JOIN FETCH emp.department dep
dostaniesz empi emp.dep. jeśli nie użyłeś pobierania, nadal możesz uzyskać, emp.depale hibernacja przetwarza kolejny wybór do bazy danych, aby uzyskać ten zestaw działu.
więc jest to tylko kwestia dostrojenia wydajności, o tym, że chcesz uzyskać wszystkie wyniki (potrzebujesz tego lub nie) w jednym zapytaniu (pobierające chętnie) lub chcesz zapytać je później, kiedy ich potrzebujesz (pobieranie z opóźnieniem).
Korzystaj z szybkiego pobierania, gdy chcesz uzyskać małe dane za pomocą jednego wyboru (jedno duże zapytanie). Lub użyj leniwego pobierania, aby zapytać o to, czego potrzebujesz (wiele mniejszych zapytań).
użyj pobierania, gdy:
nie ma dużej niepotrzebnej kolekcji / zestawu wewnątrz tej jednostki, którą masz zamiar dostać
komunikacja z serwera aplikacji do serwera bazy danych jest za daleko i zajmuje dużo czasu
Może trzeba, że zbiór ten ostatni, gdy nie masz dostępu do niego ( poza o transakcyjnej metody / klasy)