Sobes.tech
Middle
174

Fetch type дегеніміз не?

AI-дан жауап

sobes.tech AI

Fetch type в JPA байланысты объектілердің мәліметтер базасынан қалай жүктелетінін анықтайды. Екі негізгі түрі бар: EAGER және LAZY.

  • EAGER: Байланысқан объект негізгі объектімен бірге алғашқы сұрауда жүктеледі. Бұл байланысқан объект көбінесе қажет болғанда ыңғайлы, бірақ көп байланыс болғанда артық мәлімет жүктеуге және өнімділіктің төмендеуіне әкелуі мүмкін.

    // EAGER жүктеудің мысалы
    @ManyToOne(fetch = FetchType.EAGER)
    private Address address; // Address User-пен бірге жүктеледі
    
  • LAZY: Байланысқан объект тек оған бірінші рет жүгінгенде (мысалы, геттер шақырғанда) жүктеледі. Бұл қажет емес мәліметтерді жүктеуден сақтайды, бірақ әр байланысқан объектке жүгінгенде қосымша сұрау жасау керек болады, бұл "N+1 select" мәселесіне әкелуі мүмкін.

    // LAZY жүктеудің мысалы
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
    private List<Order> orders; // Orders user.getOrders() шақырғанда ғана жүктеледі
    

Fetch type таңдау — өнімділік пен ыңғайлылық арасындағы компромисс. Көптеген коллекциялар үшін (@OneToMany, @ManyToMany) әдепкі бойынша LAZY пайдаланылады, ал бір байланыстар үшін (@ManyToOne, @OneToOne) — EAGER, егер @JoinColumn аннотациясы @OneToOne-дің иеленуші жағында болмаса, әдепкі бойынша да LAZY. Әдепкі бойынша LAZY пайдалану ұсынылады және оны тек талаптарға сай болғанда ғана EAGER-ге ауыстыру керек.

LAZY пайдалану кезінде жүктеуді оңтайландыру үшін JPQL/Criteria сұрауларында FETCH JOIN немесе @NamedEntityGraph қолдануға болады.