Ką reiškia FetchType.LAZY JPA ir kaip jis veikia susijusių entitetų įkėlimą?
sobes.tech AI
Atsakymas iš AI
FetchType.LAZY JPA reiškia susijusių entitetų vėlinį įkėlimą. Vietoj visos susijusios kolekcijos arba atskiro entiteto įkėlimo, kai gaunama pagrindinė entitetas, JPA sukuria proxy objektą. Faktinis duomenų įkėlimas iš bazės įvyksta tik pirmą kartą kreipiantis į proxy objekto laukus ar metodus.
Tai leidžia:
- Optimizuoti našumą: Vengti didelio duomenų kiekio ištraukimo iš bazės, kai jie nėra naudojami.
- Sumažinti atminties suvartojimą: Įkelti tik reikalingus duomenis.
Daugeliui ryšių (@OneToMany, @ManyToMany) pagal numatytuosius nustatymus naudojamas FetchType.LAZY, o @OneToOne ir @ManyToOne – FetchType.EAGER. Galite aiškiai nurodyti įkėlimo tipą:
// Pavyzdys naudojant FetchType.LAZY
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY)
private Set<ChildEntity> children;
@ManyToOne(fetch = FetchType.LAZY)
private ParentEntity parent;
Problemų su FetchType.LAZY:
- LazyInitializationException: gali įvykti, jei bandysite pasiekti vėlinai įkeltą entitetą po to, kai uždaroma sesija, kurioje jis buvo įkeltas.
- N+1 problema: jei iteruojate per kolekciją su vėlinu įkėlimu ir kreipiatės į kiekvieną susijusį entitetą, kiekvienai kolekcijos entitetų reikės atskiro užklausos į bazę.
Sprendžiant šias problemas galima naudoti:
-
Aiškų susijusių duomenų gavimą naudojant
JOIN FETCHJPQL:// Pavyzdys naudojant JOIN FETCH SELECT p FROM ParentEntity p JOIN FETCH p.children WHERE p.id = :parentId -
JPA teikėjo nustatymus (pvz., naudojant batching).
-
@Fetch(FetchMode.JOIN)arba@Fetch(FetchMode.SELECT)anotacijas Hibernate.