Sobes.tech
Middle
180

JPA-də FetchType.LAZY nə deməkdir və əlaqəli varlıqların yüklənməsinə necə təsir edir?

AI-dan cavab

sobes.tech Süni İntellekt

JPA-də FetchType.LAZY əlaqəli varlıqların gecikdirilmiş yüklənməsini ifadə edir. Əsas varlıq alınarkən, əlaqəli kolleksiya və ya ayrı bir varlıq yüklənmədən, JPA proxy obyekti yaradır. Əsl məlumatların bazadan yüklənməsi, proxy obyektinin sahələrinə və ya metodlarına ilk dəfə müraciət edildikdə baş verir.

Bu, aşağıdakı imkanları verir:

  • Performansı optimallaşdırmaq: İstifadə olunmayan böyük məlumatların bazadan çıxarılmasından qaçınmaq.
  • Yaddaş istifadəsini azaltmaq: Yalnız lazım olan məlumatları yükləmək.

Əksər əlaqələr üçün (@OneToMany, @ManyToMany) FetchType.LAZY istifadə olunur, və @OneToOne@ManyToOne üçün — FetchType.EAGER. Yükləmə növü açıq şəkildə göstərilə bilər:

// FetchType.LAZY istifadə nümunəsi
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY)
private Set<ChildEntity> children;

@ManyToOne(fetch = FetchType.LAZY)
private ParentEntity parent;

FetchType.LAZY ilə bağlı problemlər:

  • LazyInitializationException: Əgər əlaqəli varlığa giriş sessiya bağlandıqdan sonra baş verərsə, bu xəta çıxar.
  • N+1 problemi: Əgər gecikdirilmiş yükləmə ilə kolleksiya üzərində gəzişirsiniz və hər bir əlaqəli varlığa giriş edirsinizsə, hər bir üçün ayrıca sorğu bazaya göndərilir.

Bu problemləri həll etmək üçün:

  • JOIN FETCH istifadə edərək əlaqəli məlumatları açıq şəkildə əldə etmək:

    // JOIN FETCH nümunəsi
    SELECT p FROM ParentEntity p JOIN FETCH p.children WHERE p.id = :parentId
    
  • JPA provayderinin konfiqurasiyaları (məsələn, batching istifadə etmək).

  • Hibernate-də @Fetch(FetchMode.JOIN) və ya @Fetch(FetchMode.SELECT) annotasiyasından istifadə etmək.