Fetch Type: Eager vs Lazy
Dalam Hibernate, Eager dan Lazy Fetching adalah strategi untuk mengambil/read data relasional dari database.
1️⃣ Lazy Fetching (Default untuk Collections)
Lazy Fetching adalah strategi "tunda". Hibernate hanya akan mengambil data entity utama terlebih dahulu. Data relasi baru akan diambil dari database jika dan hanya jika kita memanggilnya (misalnya melalui method getter).
- Cara Kerja: Hibernate membuat objek "Proxy" (palsu). Query
SELECTtambahan hanya dijalankan jika data tersebut dipanggil. - Kelebihan: Menghemat memori dan mempercepat beban awal objek utama.
- Kekurangan: Berisiko menyebabkan
LazyInitializationExceptionjika data diakses setelah Session ditutup. Juga dapat memicu masalah N+1 Query.
@OneToMany(mappedBy = "classes", fetch = FetchType.LAZY)
List<Student> students = new ArrayList<>();
2️⃣ Eager Fetching (Default untuk Single Object)
Eager Fetching adalah strategi di mana Hibernate akan mengambil entity utama beserta seluruh entity yang berelasi dengannya secara langsung dalam satu waktu (biasanya menggunakan JOIN).
- Cara Kerja: Saat kita mengambil objek utama, Hibernate otomatis mengambil semua data relasinya.
- Kelebihan: Data selalu tersedia, tidak ada risiko
LazyInitializationException. - Kekurangan: Performa menurun jika data relasi sangat besar atau banyak, karena query menjadi sangat berat.
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "class_id")
private Classes classes;