Sobes.tech
Middle

Czy operacja JOIN FETCH zostanie wykonana przy użyciu leniwego ładowania?

sobes.tech AI

Odpowiedź od AI

Operacja JOIN FETCH w JPA służy do ładowania związanych encji w trybie eager, czyli od razu wraz z głównym zapytaniem. Adnotacja lub konfiguracja ładowania leniwego (FetchType.LAZY) wskazuje, że powiązane dane mają być ładowane tylko na żądanie.

Jeśli w zapytaniu używany jest JOIN FETCH, powiązane encje zostaną załadowane natychmiast, niezależnie od tego, co jest wskazane w adnotacji lazy loading. Innymi słowy, JOIN FETCH nadpisuje strategię ładowania i wymusza ładowanie eager.

W związku z tym, przy użyciu JOIN FETCH, operacja zostanie wykonana, a powiązane dane zostaną załadowane od razu, pomimo ustawienia lazy loading w mapowaniu.

Przykład:

String jpql = "SELECT p FROM Parent p JOIN FETCH p.children WHERE p.id = :id";
Parent parent = entityManager.createQuery(jpql, Parent.class)
    .setParameter("id", 1L)
    .getSingleResult();
// Dzieci zostaną załadowane od razu, nawet jeśli w Parent.children ustawiono FetchType.LAZY