Sobes.tech
Middle

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 @ManyToOneFetchType.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 FETCH JPQL:

    // 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.