Apa sebenarnya yang dikontrol strategi pengambilan JPA? Saya tidak dapat mendeteksi perbedaan apa pun antara bersemangat dan malas. Dalam kedua kasus JPA / Hibernate tidak secara otomatis menggabungkan hubungan banyak-ke-satu.
Contoh: Orang memiliki satu alamat. Sebuah alamat bisa menjadi milik banyak orang. Kelas entitas beranotasi JPA terlihat seperti:
@Entity
public class Person {
@Id
public Integer id;
public String name;
@ManyToOne(fetch=FetchType.LAZY or EAGER)
public Address address;
}
@Entity
public class Address {
@Id
public Integer id;
public String name;
}
Jika saya menggunakan kueri JPA:
select p from Person p where ...
JPA / Hibernate menghasilkan satu kueri SQL untuk dipilih dari tabel Orang, dan kemudian kueri alamat berbeda untuk setiap orang:
select ... from Person where ...
select ... from Address where id=1
select ... from Address where id=2
select ... from Address where id=3
Ini sangat buruk untuk set hasil yang besar. Jika ada 1000 orang, itu menghasilkan 1001 kueri (1 dari Orang dan 1000 berbeda dari Alamat). Saya tahu ini karena saya melihat log kueri MySQL. Itu adalah pemahaman saya bahwa pengaturan tipe fetch alamat menjadi bersemangat akan menyebabkan JPA / Hibernate secara otomatis melakukan kueri dengan bergabung. Namun, apa pun jenis pengambilannya, ini tetap menghasilkan kueri yang berbeda untuk hubungan.
Hanya ketika saya secara eksplisit menyuruhnya untuk bergabung, apakah itu benar-benar bergabung:
select p, a from Person p left join p.address a where ...
Apakah saya melewatkan sesuatu di sini? Saya sekarang harus memberikan kode untuk setiap kueri sehingga meninggalkan hubungan banyak-ke-satu. Saya menggunakan implementasi JPA Hibernate dengan MySQL.
Sunting: Tampaknya (lihat FAQ Hibernasi di sini dan di sini ) yang FetchType
tidak memengaruhi kueri JPA. Jadi dalam kasus saya, saya secara eksplisit menyuruhnya bergabung.