Pertama, beberapa klarifikasi untuk jawaban KLE :
Asosiasi tak terbatas (nullable) satu-ke-satu adalah satu-satunya yang tidak dapat diproksi tanpa instrumentasi bytecode. Alasan untuk ini adalah bahwa entitas pemilik HARUS tahu apakah properti asosiasi harus berisi objek proxy atau NULL dan tidak dapat menentukan bahwa dengan melihat kolom tabel dasarnya karena satu-ke-satu yang biasanya dipetakan melalui PK bersama, sehingga harus bersemangat diambil pula membuat proxy tidak berguna. Berikut penjelasan yang lebih detail .
banyak-ke-satu asosiasi (dan satu-ke-banyak, jelas) tidak menderita masalah ini. Entitas pemilik dapat dengan mudah memeriksa FK-nya sendiri (dan dalam kasus satu-ke-banyak, proksi pengumpulan kosong dibuat pada awalnya dan diisi sesuai permintaan), sehingga asosiasi dapat menjadi malas.
Mengganti satu-ke-satu dengan satu-ke-banyak hampir tidak pernah merupakan ide yang baik. Anda dapat menggantinya dengan banyak-ke-satu yang unik tetapi ada opsi lain (mungkin lebih baik).
Rob H. memiliki poin yang valid, namun Anda mungkin tidak dapat mengimplementasikannya tergantung pada model Anda (misalnya jika asosiasi satu-ke-satu Anda dapat dibatalkan).
Sekarang, sejauh pertanyaan awal:
A) @ManyToOne(fetch=FetchType.LAZY)
harus bekerja dengan baik. Apakah Anda yakin itu tidak ditimpa dalam kueri itu sendiri? Dimungkinkan untuk menentukan join fetch
dalam HQL dan / atau secara eksplisit mengatur mode pengambilan melalui API Kriteria yang akan diutamakan daripada anotasi kelas. Jika bukan itu masalahnya dan Anda masih mengalami masalah, silakan kirim kelas, kueri, dan hasilkan SQL untuk percakapan lebih lanjut.
B) @OneToOne
lebih rumit. Jika jelas tidak dapat dibatalkan, ikuti saran Rob H. dan tentukan sebagai berikut:
@OneToOne(optional = false, fetch = FetchType.LAZY)
Jika tidak, jika Anda dapat mengubah basis data Anda (tambahkan kolom kunci asing ke tabel pemilik), lakukan dan petakan sebagai "bergabung":
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name="other_entity_fk")
public OtherEntity getOther()
dan di OtherEntity:
@OneToOne(mappedBy = "other")
public OwnerEntity getOwner()
Jika Anda tidak bisa melakukan itu (dan tidak bisa hidup dengan bersemangat mengambil) instrumentasi bytec adalah satu-satunya pilihan Anda. Namun saya harus setuju dengan CPerkins - jika Anda punya 80 !!! bergabung karena asosiasi OneToOne yang bersemangat, Anda punya masalah yang lebih besar maka ini :-)
one-to-one
dengan rumus sepertiselect other_entity.id from other_entity where id = other_entity.id
. Tentu saja, ini tidak ideal untuk kinerja permintaan.