Spring Boot'ta (ve genel olarak Hibernate veya JPA'da) fetch type (veri çekme tipi), bir ilişkisel veritabanından verilerin nasıl alınacağını kontrol etmek için kullanılır. Fetch type, ilişkili varlıkların (entity'lerin) yüklenme zamanını belirler. JPA'da iki tür fetch type vardır:
1. EAGER (Hemen Yükleme)
- İlişkili veriler anında yüklenir, yani ana varlık yüklendiğinde ilişkili varlıklar da hemen belleğe alınır.
- İlişkili varlık ne kadar büyük olursa, performansa o kadar olumsuz etkisi olabilir.
- Özellikle, gereksiz ilişkili verileri yüklemek istemediğiniz durumlarda dikkatli kullanılmalıdır.
@OneToMany(fetch = FetchType.EAGER)
private List<Order> orders;
Özellikler:
- Daha fazla bellek kullanımı.
- Genellikle, küçük ilişkilerde veya her zaman ihtiyaç duyulan verilerde kullanılır.
2. LAZY (Tembel Yükleme)
- İlişkili veriler, gerektiğinde yüklenir. Ana varlık yüklendiğinde ilişkili veriler yüklenmez; ancak ilişkiye ilk erişimde yükleme yapılır.
- Daha az bellek kullanır ve performansı artırabilir.
- Ancak, ilişkili veriye erişim sırasında LazyInitializationException alabilirsiniz (örneğin, session kapalıysa).
@OneToMany(fetch = FetchType.LAZY)
private List<Order> orders;
Özellikler:
- Daha az başlangıç yükü.
- Büyük veri setleri için önerilir.
- Verilere ihtiyaç duyulana kadar yüklenmez.
Varsayılan Fetch Tipleri
Her ilişki türü için JPA, varsayılan bir fetch type belirlemiştir:
- @OneToOne: EAGER
- @ManyToOne: EAGER
- @OneToMany: LAZY
- @ManyToMany: LAZY
Hangi Fetch Type Kullanılmalı?
- LAZY varsayılan olarak tercih edilir çünkü başlangıçta gereksiz veri yüklenmesini önler.
- EAGER, yalnızca ilişkili verilerin her zaman gerekli olduğu durumlarda kullanılmalıdır.
- Büyük veri setleri ve çok karmaşık ilişkilerde performansı optimize etmek için LAZY genellikle daha uygun bir seçenektir.
İlişkiler ve Fetch Type Kullanımı Örneği
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
private List<Order> orders;
}
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String description;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "user_id")
private User user;
}
*Gönderi ve görsel chatgpt ile oluşturulmuştur.