ฉันคิดว่านั่น@EmbeddedIdอาจเป็นรายละเอียดมากกว่าเนื่องจาก@IdClassคุณไม่สามารถเข้าถึงวัตถุคีย์หลักทั้งหมดโดยใช้ตัวดำเนินการเข้าถึงฟิลด์ใด ๆ โดยใช้สิ่งที่@EmbeddedIdคุณสามารถทำได้ดังนี้:
@Embeddable class EmployeeId { name, dataOfBirth }
@Entity class Employee {
@EmbeddedId EmployeeId employeeId;
...
}
สิ่งนี้ให้ความเข้าใจที่ชัดเจนเกี่ยวกับฟิลด์ที่สร้างคีย์คอมโพสิตเนื่องจากถูกรวมไว้ในคลาสที่เข้าถึงโดยใช้ตัวดำเนินการเข้าถึงฟิลด์
ความแตกต่างอีกด้วย@IdClassและ@EmbeddedIdเมื่อมันมาถึงการเขียน HQL:
กับ@IdClassคุณเขียน:
เลือก e.name จาก Employee e
และ@EmbeddedIdคุณต้องเขียน:
เลือก e.employeeId.name จาก Employee e
คุณต้องเขียนข้อความเพิ่มเติมสำหรับแบบสอบถามเดียวกัน IdClassบางคนอาจเถียงว่าแตกต่างจากภาษาธรรมชาติมากขึ้นเช่นเดียวกับการส่งเสริมโดย แต่ส่วนใหญ่แล้วการทำความเข้าใจอย่างถูกต้องจากข้อความค้นหาว่าเขตข้อมูลที่กำหนดเป็นส่วนหนึ่งของคีย์คอมโพสิตนั้นเป็นความช่วยเหลืออันล้ำค่า
@IdClassแม้ว่าฉันจะชอบ@EmbeddedIdในสถานการณ์ส่วนใหญ่ก็ตาม(เรียนรู้สิ่งนี้จากเซสชันของ Antonio Goncalves สิ่งที่เขาแนะนำคือเราสามารถใช้@IdClassในกรณีที่มีการผสม ไม่สามารถเข้าถึงคลาสคีย์หรือมาจากโมดูลอื่นหรือรหัสเดิมซึ่งเราไม่สามารถเพิ่มคำอธิบายประกอบได้ในสถานการณ์เหล่านั้น@IdClassจะให้วิธีของเรา