Mi az a fetch típus?
sobes.tech MI
Válasz az MI-től
A fetch típus a JPA-ban meghatározza, hogy a kapcsolódó entitások hogyan töltődnek be az adatbázisból. Két fő típus létezik: EAGER és LAZY.
-
EAGER: A kapcsolódó entitás az első lekérdezés során töltődik be a fő entitással együtt. Ez akkor hasznos, ha a kapcsolódó entitás szinte mindig szükséges, de túlzott adatbetöltést és teljesítménycsökkenést okozhat sok kapcsolat esetén.
// EAGER betöltés példája @ManyToOne(fetch = FetchType.EAGER) private Address address; // Address a User-vel együtt töltődik be -
LAZY: A kapcsolódó entitás csak az első hozzáféréskor töltődik be (pl. getter hívásakor). Ez elkerüli a szükségtelen adatok betöltését, de minden hozzáféréskor további lekérdezést igényel az adatbázisból, ami a "N+1 select" problémát okozhatja.
// LAZY betöltés példája @OneToMany(fetch = FetchType.LAZY, mappedBy = "user") private List<Order> orders; // Orders csak akkor töltődik be, amikor user.getOrders() hívás történik
A fetch típus választása kompromisszum a teljesítmény és a kényelem között. A legtöbb kollekció esetében (@OneToMany, @ManyToMany) alapértelmezés szerint LAZY, míg az egységes kapcsolatoknál (@ManyToOne, @OneToOne) — EAGER, kivéve, ha nincs @JoinColumn annotáció a tulajdonosi oldalon @OneToOne-nál, ekkor szintén alapértelmezett a LAZY. Ajánlott az alapértelmezett LAZY használata, és csak akkor váltani EAGER-re, ha ez indokolt.
A LAZY betöltés optimalizálására JPQL/Criteria lekérdezéseket lehet alkalmazni FETCH JOIN vagy @NamedEntityGraph segítségével.