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