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 emp
i emp.dep
. jeśli nie użyłeś pobierania, nadal możesz uzyskać, emp.dep
ale 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)