Öncelikle, KLE'nin cevabına bazı açıklamalar :
Kısıtsız (nulllable) bire bir ilişki, bayt kodu enstrümantasyonu olmadan proxy edilemeyen tek ilişkidir. Bunun nedeni, sahibi varlığın, ilişkilendirme özelliğinin bir proxy nesnesi mi yoksa NULL içermesi mi gerektiğini GEREKMESİ GEREKİR ve normalde paylaşılan PK aracılığıyla eşleştirilen bire bir nedeniyle temel tablonun sütunlarına bakarak bunu belirleyemez. vekaletle vekalet etmek için istekli bir şekilde getirilmelidir. İşte daha ayrıntılı bir açıklama.
birebir dernekler (ve açıkça birebir) bu sorundan muzdarip değildir. Sahip kuruluş kendi FK'sini kolayca kontrol edebilir (ve bire çok olması durumunda, başlangıçta boş toplama proxy'si oluşturulur ve istek üzerine doldurulur), böylece dernek tembel olabilir.
Bire bir ile bire çok arasında değiştirmek, asla iyi bir fikir değildir. Bunu benzersiz bire bir ile değiştirebilirsiniz, ancak başka (muhtemelen daha iyi) seçenekler vardır.
Rob H. ancak modele bağlı olarak bunu uygulamak mümkün olmayabilir, geçerli bir noktası vardır (örneğin one-to-one dernek eğer olduğunu null).
Şimdi, orijinal soruya gelince:
A) @ManyToOne(fetch=FetchType.LAZY)
iyi çalışmalıdır. Sorgunun üzerine yazılmadığından emin misiniz? join fetch
HQL'de ve / veya sınıf ek açıklamalarına göre öncelikli olacak Ölçüt API'sı aracılığıyla açıkça getirme modunu belirtmek mümkündür . Durum böyle değilse ve hala sorun yaşıyorsanız, lütfen daha fazla konuşma için sınıflarınızı, sorgunuzu ve sonuçta ortaya çıkan SQL'i gönderin.
B) @OneToOne
daha hileli. Kesinlikle hükümsüz değilse, Rob H.'nin önerisine gidin ve şöyle belirtin:
@OneToOne(optional = false, fetch = FetchType.LAZY)
Aksi takdirde, veritabanınızı değiştirebilirseniz (sahip tablosuna bir yabancı anahtar sütunu ekleyin), bunu yapın ve "birleştirilmiş" olarak eşleyin:
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name="other_entity_fk")
public OtherEntity getOther()
ve OtherEntity'de:
@OneToOne(mappedBy = "other")
public OwnerEntity getOwner()
Bunu yapamıyorsanız (ve istekli getirme ile yaşayamazsanız) bytecode enstrümantasyonu tek seçeneğinizdir. 80 Varsa , ancak - CPerkins ile anlaşmak zorunda !!! istekli OneToOne dernekleri nedeniyle katılır, bundan daha büyük sorunlarınız olur :-)
one-to-one
a gibi bir formül kullanınselect other_entity.id from other_entity where id = other_entity.id
. Tabii ki, bu sorgu performansları için ideal değildir.