ก่อนอื่นขอให้ชี้แจงคำตอบของKLE :
การเชื่อมโยงแบบหนึ่งต่อหนึ่งแบบไม่ จำกัด (เป็นโมฆะ) เป็นสิ่งเดียวที่ไม่สามารถใช้พร็อกซีได้ เหตุผลนี้คือว่าเจ้าของกิจการต้องทราบว่าคุณสมบัติการเชื่อมโยงควรมีวัตถุพร็อกซีหรือ NULL และไม่สามารถระบุได้ว่าโดยการดูที่คอลัมน์ของตารางฐานเนื่องจากปกติหนึ่งต่อหนึ่งถูกแมปผ่าน PK ที่ใช้ร่วมกันดังนั้น จะต้องมีการดึงข้อมูลอย่างกระตือรือร้นทำให้พร็อกซีไม่มีจุดหมาย นี่คือคำอธิบายโดยละเอียดเพิ่มเติม
การเชื่อมโยงแบบหลายต่อหนึ่ง (และแบบหนึ่งต่อหลาย) ไม่ประสบปัญหานี้ เจ้าของกิจการสามารถตรวจสอบ FK ของตัวเองได้อย่างง่ายดาย (และในกรณีที่มีการสร้างพร็อกซีคอลเลกชันที่ว่างเปล่าแบบหนึ่งต่อหลายคนจะถูกสร้างขึ้นครั้งแรกและเติมตามความต้องการ) ดังนั้นการเชื่อมโยงจึงขี้เกียจ
การแทนที่แบบหนึ่งต่อหนึ่งด้วยแบบหนึ่งต่อหลายคนค่อนข้างจะไม่เป็นความคิดที่ดี คุณสามารถแทนที่ด้วยตัวเลือกแบบตัวต่อตัว แต่มีตัวเลือกอื่น ๆ (อาจดีกว่า)
Rob H.มีจุดที่ถูกต้อง แต่คุณอาจไม่สามารถใช้งานได้ขึ้นอยู่กับรุ่นของคุณ (เช่นถ้าการเชื่อมต่อแบบหนึ่งต่อหนึ่งของคุณเป็นโมฆะ)
ตอนนี้เท่าที่คำถามเดิมไป:
A) @ManyToOne(fetch=FetchType.LAZY)
ควรใช้งานได้ดี คุณแน่ใจหรือไม่ว่าไม่มีการเขียนทับลงในแบบสอบถาม เป็นไปได้ที่จะระบุjoin fetch
ใน HQL และ / หรือตั้งค่าโหมดดึงข้อมูลอย่างชัดเจนผ่าน Criteria API ซึ่งจะมีความสำคัญเหนือกว่าคำอธิบายประกอบในชั้นเรียน หากไม่ใช่ในกรณีนี้และคุณยังคงมีปัญหาอยู่โปรดโพสต์คลาสการสืบค้นและผลลัพธ์ SQL สำหรับการสนทนาที่ตรงประเด็นมากขึ้น
B) @OneToOne
มีเล่ห์เหลี่ยม ถ้ามันไม่เป็นโมฆะแน่นอนไปกับข้อเสนอแนะของ Rob H. และระบุว่าเป็นเช่นนี้:
@OneToOne(optional = false, fetch = FetchType.LAZY)
มิฉะนั้นถ้าคุณสามารถเปลี่ยนฐานข้อมูลของคุณ (เพิ่มคอลัมน์คีย์ต่างประเทศลงในตารางเจ้าของ) ให้ทำและแมปเป็น "เข้าร่วม":
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name="other_entity_fk")
public OtherEntity getOther()
และใน OtherEntity:
@OneToOne(mappedBy = "other")
public OwnerEntity getOwner()
หากคุณไม่สามารถทำเช่นนั้น (และไม่สามารถอยู่กับการดึงข้อมูลด้วยความกระตือรือร้น) เครื่องมือวัด bytecode เป็นทางเลือกเดียว ฉันต้องเห็นด้วยกับCPerkinsอย่างไรก็ตาม - ถ้าคุณมี80 !!! เข้าร่วมเนื่องจากความสนใจ OneToOne สมาคมคุณมีปัญหามากขึ้นแล้ว :-) นี้
one-to-one
select other_entity.id from other_entity where id = other_entity.id
แน่นอนว่ามันไม่เหมาะสำหรับการแสดงคำค้นหา