एक समग्र कुंजी के नक्शे के लिए, आप उपयोग कर सकते हैं EmbeddedId
याIdClass
एनोटेशन। मुझे पता है कि यह सवाल जेपीए के बारे में कड़ाई से नहीं है, लेकिन विनिर्देश द्वारा परिभाषित नियम भी लागू होते हैं। तो यहाँ वे हैं:
2.1.4 प्राथमिक कुंजी और इकाई पहचान
...
एक समग्र प्राथमिक कुंजी या तो एक निरंतर क्षेत्र या संपत्ति या ऐसे क्षेत्रों या गुणों के एक सेट के अनुरूप होनी चाहिए, जैसा कि नीचे वर्णित है। एक प्राथमिक कुंजी वर्ग को एक समग्र प्राथमिक कुंजी का प्रतिनिधित्व करने के लिए परिभाषित किया जाना चाहिए। समग्र प्राथमिक कुंजी आमतौर पर तब उत्पन्न होती है जब डेटाबेस कुंजी कई स्तंभों से युक्त होती है जब विरासत डेटाबेस से मैपिंग होती है। और
एनोटेशन समग्र प्राथमिक कुंजी निरूपित करने के लिए उपयोग किया जाता है। अनुभाग 9.1.14 और 9.1.15 देखें।EmbeddedId
IdClass
...
समग्र प्राथमिक कुंजियों के लिए निम्नलिखित नियम लागू होते हैं:
- प्राथमिक कुंजी वर्ग सार्वजनिक होना चाहिए और एक सार्वजनिक गैर-arg निर्माता होना चाहिए।
- यदि संपत्ति-आधारित पहुंच का उपयोग किया जाता है, तो प्राथमिक कुंजी वर्ग के गुण सार्वजनिक या संरक्षित होने चाहिए।
- प्राथमिक कुंजी वर्ग होना चाहिए
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
एनोटेशन तालिका पी करने के लिए कई फ़ील्ड को मैप।
साथ में 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
एनोटेशन तालिका पी करने के लिए एक पी वर्ग मैप करता है।
अंतर:
- भौतिक मॉडल के दृष्टिकोण से, कोई मतभेद नहीं हैं
@EmbeddedId
किसी भी तरह अधिक स्पष्ट रूप से संवाद करता है कि कुंजी एक संयुक्त कुंजी है और आईएमओ समझ में आता है जब संयुक्त पीके या तो एक सार्थक इकाई है या यह आपके कोड में पुन: उपयोग किया जाता है ।
@IdClass
यह निर्दिष्ट करने के लिए उपयोगी है कि खेतों का कुछ संयोजन अद्वितीय है लेकिन इनका कोई विशेष अर्थ नहीं है ।
वे आपके प्रश्नों को लिखने के तरीके को भी प्रभावित करते हैं (उन्हें कम या ज्यादा क्रिया करना):
संदर्भ
- जेपीए 1.0 विनिर्देश
- धारा 2.1.4 "प्राथमिक कुंजी और इकाई पहचान"
- धारा 9.1.14 "एंबेडेडआईड एनोटेशन"
- धारा 9.1.15 "IdClass एनोटेशन"