ต้องการแมคีย์คอมโพสิตคุณสามารถใช้EmbeddedId
หรือIdClass
คำอธิบายประกอบ ฉันรู้ว่าคำถามนี้ไม่ได้เกี่ยวกับ JPA อย่างเคร่งครัด แต่กฎที่กำหนดโดยข้อกำหนดยังใช้ ดังนั้นพวกเขาอยู่ที่นี่:
2.1.4 คีย์หลักและรหัสประจำตัว
...
คีย์หลักผสมต้องสอดคล้องกับเขตข้อมูลถาวรหรือคุณสมบัติเดียวหรือกับชุดของเขตข้อมูลหรือคุณสมบัติดังที่อธิบายไว้ด้านล่าง ต้องกำหนดคลาสคีย์หลักเพื่อแทนคีย์หลักแบบรวม โดยทั่วไปแล้วคีย์หลักแบบรวมจะเกิดขึ้นเมื่อทำการแมปจากฐานข้อมูลแบบดั้งเดิมเมื่อคีย์ฐานข้อมูลประกอบด้วยหลายคอลัมน์ และ
คำอธิบายประกอบที่ใช้ในการแสดงคีย์หลักคอมโพสิต ดูหัวข้อ 9.1.14 และ 9.1.15EmbeddedId
IdClass
...
กฎต่อไปนี้ใช้กับคีย์หลักแบบรวม:
- คลาสคีย์หลักต้องเป็นสาธารณะและต้องมีตัวสร้างแบบไม่มีอาร์กิวเมนต์สาธารณะ
- หากใช้การเข้าถึงตามคุณสมบัติคุณสมบัติของคลาสคีย์หลักต้องเป็นพับลิกหรือได้รับการป้องกัน
serializable
ชั้นคีย์หลักจะต้องเป็น
- คลาสคีย์หลักต้องกำหนด
equals
และhashCode
วิธีการ ความหมายของความเท่าเทียมกันของค่าสำหรับวิธีการเหล่านี้จะต้องสอดคล้องกับความเท่าเทียมกันของฐานข้อมูลสำหรับประเภทฐานข้อมูลที่คีย์ถูกแมป
- คีย์หลักแบบผสมต้องแสดงและแมปเป็นคลาสที่สามารถฝังได้ (ดูส่วน 9.1.14, "คำอธิบายประกอบแบบฝังตัว") หรือต้องแสดงและแมปกับหลาย ๆ ฟิลด์หรือคุณสมบัติของคลาสเอนทิตี (ดูหัวข้อ 9.1.15, "IdClass คำอธิบายประกอบ”)
- ถ้าคลาสคีย์หลักผสมถูกแมปไปยังหลายเขตข้อมูลหรือคุณสมบัติของคลาสเอนทิตี้ชื่อของเขตข้อมูลคีย์หลักหรือคุณสมบัติในคลาสคีย์หลักและของคลาสเอนทิตีต้องตรงกันและประเภทของพวกเขาจะต้องเหมือนกัน
ด้วยการ IdClass
คลาสสำหรับคีย์หลักคอมโพสิตอาจมีลักษณะ (อาจเป็นคลาสภายในคงที่):
public class TimePK implements Serializable {
protected Integer levelStation;
protected Integer confPathID;
public TimePK() {}
public TimePK(Integer levelStation, Integer confPathID) {
this.levelStation = levelStation;
this.confPathID = confPathID;
}
// equals, hashCode
}
และหน่วยงาน:
@Entity
@IdClass(TimePK.class)
class Time implements Serializable {
@Id
private Integer levelStation;
@Id
private Integer confPathID;
private String src;
private String dst;
private Integer distance;
private Integer price;
// getters, setters
}
IdClass
คำอธิบายประกอบแผนที่หลายเขตข้อมูลไปยังตาราง PK
กับ EmbeddedId
คลาสสำหรับคีย์หลักคอมโพสิตอาจมีลักษณะ (อาจเป็นคลาสภายในคงที่):
@Embeddable
public class TimePK implements Serializable {
protected Integer levelStation;
protected Integer confPathID;
public TimePK() {}
public TimePK(Integer levelStation, Integer confPathID) {
this.levelStation = levelStation;
this.confPathID = confPathID;
}
// equals, hashCode
}
และหน่วยงาน:
@Entity
class Time implements Serializable {
@EmbeddedId
private TimePK timePK;
private String src;
private String dst;
private Integer distance;
private Integer price;
//...
}
@EmbeddedId
คำอธิบายประกอบแผนที่ระดับ PK เพื่อ PK ตาราง
แตกต่าง:
- จากมุมมองแบบจำลองทางกายภาพไม่มีความแตกต่าง
@EmbeddedId
อย่างใดติดต่อสื่อสารได้อย่างชัดเจนมากขึ้นที่สำคัญคือคีย์คอมโพสิตและ IMO ทำให้รู้สึกเมื่อ PK รวมเป็นทั้งนิติบุคคลที่มีความหมายของตัวเองหรือนำกลับมาใช้ในรหัสของคุณ
@IdClass
เป็นประโยชน์ในการระบุว่าการรวมกันของเขตข้อมูลบางอย่างที่ไม่ซ้ำกัน แต่สิ่งเหล่านี้ไม่ได้มีความหมายพิเศษ
พวกเขายังส่งผลกระทบต่อวิธีที่คุณเขียนแบบสอบถาม (ทำให้ verbose มากขึ้นหรือน้อยลง):
อ้างอิง
- ข้อกำหนด JPA 1.0
- ส่วน 2.1.4 "คีย์หลักและรหัสประจำตัว"
- ส่วน 9.1.14 "คำอธิบายประกอบแบบฝังตัว"
- ส่วน 9.1.15 "คำอธิบายประกอบ IdClass"