Sobes.tech
Middle
183

JPA'da FetchType.LAZY ne anlama gelir ve ilişkili varlıkların yüklenmesini nasıl etkiler?

AI'dan gelen yanıt

sobes.tech yapay zeka

JPA'da FetchType.LAZY, ilişkili varlıkların ertelenmiş yüklenmesini ifade eder. Ana varlık alınırken, ilişkili koleksiyon veya ayrı bir varlık yüklenmek yerine, JPA bir proxy nesnesi oluşturur. Veritabanından gerçek veri yükleme, proxy nesnesinin alanlarına veya metodlarına ilk erişildiğinde gerçekleşir.

Bu, şunlara olanak tanır:

  • Performansı optimize etmek: Kullanılmayan büyük veri miktarını veritabanından çekmekten kaçınmak.
  • Bellek kullanımını azaltmak: Sadece gerekli verileri yüklemek.

Varsayılan olarak, çoğu ilişki (@OneToMany, @ManyToMany) için FetchType.LAZY kullanılır, ve @OneToOne ile @ManyToOne için FetchType.EAGER kullanılır. Yükleme türü açıkça belirtilebilir:

// FetchType.LAZY kullanım örneği
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY)
private Set<ChildEntity> children;

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

FetchType.LAZY ile ilgili sorunlar:

  • LazyInitializationException: Bağlantı kapandıktan sonra, yüklenmiş ilişkili varlığa erişmeye çalışırsanız ortaya çıkabilir.
  • N+1 problemi: Ertelenmiş yükleme ile koleksiyon üzerinde gezinirken, her bir ilişkili varlık için ayrı sorgu çalıştırılır.

Bu sorunları çözmek için:

  • JPQL'de JOIN FETCH kullanarak ilişkili verileri açıkça alın:

    // JOIN FETCH örneği
    SELECT p FROM ParentEntity p JOIN FETCH p.children WHERE p.id = :parentId
    
  • JPA sağlayıcı ayarları (örneğin, batching kullanmak).

  • Hibernate'de @Fetch(FetchMode.JOIN) veya @Fetch(FetchMode.SELECT) anotasyonu kullanılabilir.