JPA: @JoinColumn और @PrimaryKeyJoinColumn में अंतर?


83

@JoinColumnऔर इसके बीच सटीक अंतर क्या है @PrimaryKeyJoinColumn?

आप उन @JoinColumnस्तंभों के लिए उपयोग करते हैं जो एक विदेशी कुंजी का हिस्सा हैं। एक विशिष्ट स्तंभ जैसा दिख सकता है (जैसे अतिरिक्त विशेषताओं के साथ एक सम्मिलित तालिका में):

@ManyToOne
@JoinColumn(name = "...")
private OtherClass oc;

अगर मैं कॉलम को / a और PK को भी बढ़ावा देता हूं, तो (रिश्ते की पहचान करने वाला उर्फ)? जैसा कि स्तंभ अब PK है, मुझे इसके साथ टैग करना होगा @Id:

@Id
@ManyToOne
@JoinColumn(name = "...")
private OtherClass oc;

अब सवाल यह है:

बस के रूप में @Id+ @JoinColumnवही कर रहे हैं @PrimaryKeyJoinColumn?

@ManyToOne
@PrimaryKeyJoinColumn(name = "...")
private OtherClass oc;

यदि नहीं, तो @PrimaryKeyJoinColumnइसके लिए क्या है ?

जवाबों:


55

अगर मैं कॉलम को / a और PK को भी बढ़ावा देता हूं, तो (रिश्ते की पहचान करने वाला उर्फ)? जैसा कि कॉलम अब PK है, मुझे इसे @Id (...) के साथ टैग करना होगा।

के इस बढ़ाया समर्थन व्युत्पन्न पहचानकर्ता वास्तव में का हिस्सा है जेपीए 2.0 में नई सामग्री (देखें खंड 2.4.1 प्राथमिक कुंजी व्युत्पन्न पहचान के अनुरूप जेपीए 2.0 विनिर्देश में), जेपीए 1.0 की अनुमति नहीं है Idपर एक OneToOneया ManyToOne। JPA 1.0 के साथ, आपको विदेशी कुंजी कॉलम के लिए मैपिंग का उपयोग करना होगा PrimaryKeyJoinColumnऔर परिभाषित भी करना होगा Basic Id

अब सवाल यह है कि क्या @Id + @JoinColumn सिर्फ @PrimaryKeyJoinColumn की तरह ही हैं?

आप एक समान परिणाम प्राप्त कर सकते हैं लेकिन Idऑन OneToOneया ManyToOneका उपयोग करना बहुत सरल है और जेपीए 2.0 के साथ व्युत्पन्न पहचानकर्ताओं को मैप करने का पसंदीदा तरीका है। PrimaryKeyJoinColumnअभी भी एक संयुक्त विरासत की रणनीति में इस्तेमाल किया जा सकता है । JPA 2.0 विनिर्देश से संबंधित अनुभाग के नीचे:

11.1.40 प्राइमरीकेयॉइनकॉल्यूशन एनोटेशन

PrimaryKeyJoinColumnएनोटेशन एक प्राथमिक कुंजी स्तंभ है कि एक और मेज पर शामिल होने के लिए एक विदेशी कुंजी के रूप में प्रयोग किया जाता है निर्दिष्ट करता है।

PrimaryKeyJoinColumnटिप्पणी में एक इकाई उपवर्ग के प्राथमिक तालिका में शामिल होने के लिए किया जाता है JOINED इसकी सुपर क्लास के प्राथमिक तालिका में मानचित्रण रणनीति; इसका उपयोग SecondaryTableएनोटेशन के भीतर एक प्राथमिक तालिका में एक प्राथमिक तालिका में शामिल होने के लिए किया जाता है ; और इसका उपयोग OneToOne मैपिंग में किया जा सकता है जिसमें संदर्भित इकाई की प्राथमिक कुंजी को संदर्भित इकाई के लिए एक विदेशी कुंजी के रूप में उपयोग किया जाता है [108]

...

PrimaryKeyJoinColumn जोइनिंग मैपिंग रणनीति में एक उपवर्ग के लिए कोई एनोटेशन निर्दिष्ट नहीं किया जाता है, तो विदेशी कुंजी कॉलम को सुपरक्लास की प्राथमिक तालिका के प्राथमिक कुंजी कॉलम के समान नाम दिए गए हैं।

...

उदाहरण: ग्राहक और ValuedCustomer उपवर्ग

@Entity
@Table(name="CUST")
@Inheritance(strategy=JOINED)
@DiscriminatorValue("CUST")
public class Customer { ... }

@Entity
@Table(name="VCUST")
@DiscriminatorValue("VCUST")
@PrimaryKeyJoinColumn(name="CUST_ID")
public class ValuedCustomer extends Customer { ... }

[१० mechanisms ] धारा २.४.१.१ में वर्णित व्युत्पन्न आईडी तंत्र को अब PrimaryKeyJoinColumnवनटॉन मैपिंग मामले के लिए प्राथमिकता दी जाएगी ।

यह सभी देखें


यह स्रोत http://weblogs.java.net/blog/felipegaucho/archive/2009/10/24/jpa-join-table-additional-state बताता है कि @ManyToOne और @Id का उपयोग करके JPA 1.x. अब कौन सही है?

लेखक JPA 1.0 (!) के बारे में एक लेख लिखने के लिए EclipseLink के पूर्व रिलीज़ JPA 2.0 अनुरूप संस्करण ( लेख के समय संस्करण 2.0.0-M7 ) का उपयोग कर रहा है! यह लेख भ्रामक है, लेखक कुछ का उपयोग कर रहा है जो जेपीए 1.0 का हिस्सा नहीं है

रिकॉर्ड के लिए, के समर्थन Idपर OneToOneऔर ManyToOneEclipseLink 1.1 में जोड़ दिया गया है (देखें इस संदेश से जेम्स सदरलैंड , EclipseLink comitter और का मुख्य योगदान जावा हठ विकी पुस्तक)। लेकिन मुझे जिद करने दें, यह JPA 1.0 का हिस्सा नहीं है


यह स्रोत weblogs.java.net/blog/felipegaucho/archive/2009/10/24/… बताता है कि @ManyToOne और @Id का उपयोग करते हुए JPA 1.x के साथ काम करता है। अब कौन सही है?
कावू

ठीक। इसे साफ करने के लिए धन्यवाद। मैं सही हूं कि खराब उदाहरण @IdClass का गलत इस्तेमाल करता है? क्या इकाई वर्ग में अलग-अलग (निरर्थक / डुप्लिकेट) कॉलम में @Id एनोटेशन को सही नहीं होना चाहिए? (हालांकि मुझे पता है कि
@IdClass

मेरा मतलब है, कक्षा में दो संपत्तियां होनी चाहिए: @ आईडॉल @ निजी निजी स्ट्रिंग संस्थान; और @ आईड @ कल्मूल प्राइवेट स्ट्रिंग प्रतियोगिता; सिर्फ पीके सही निर्दिष्ट करने के लिए?
कावू

@ कव्वा मुझे खेद है लेकिन ईमानदारी से, एक छोटी टिप्पणी बॉक्स में इस पर चर्चा करना बहुत कठिन है। मुझे यकीन नहीं है कि मुझे समझ में आया कि आप किस बारे में बात कर रहे हैं। यदि आपके पास एक और विशिष्ट प्रश्न है, तो मैं सुझाव देता हूं कि या तो एक जेपीए कार्यान्वयन चुनें और एक छोटा सा प्रयोग करें या एक नया प्रश्न पूरे उदाहरण (और जेपीए संस्करण) के साथ पोस्ट करें । इससे चीजें बहुत आसान हो जाएंगी।
पास्कल थिवेंट

38

मैं इस आरेख के माध्यम से आम तौर पर इन दोनों को अलग करता हूं:

उपयोग PrimaryKeyJoinColumn

यहां छवि विवरण दर्ज करें

उपयोग JoinColumn

यहां छवि विवरण दर्ज करें


3
@ आयुष, PrimaryKeyJoinColumnदो टेबल में शामिल होने के लिए एक ही प्राथमिक कुंजी का उपयोग करें, और JoinColumn, मुख्य तालिका की प्राथमिक कुंजी दूसरी तालिका में विदेशी कुंजी बन जाएगी।
सैम वाईसी

2

मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन उपयोग करने के लिए एक अच्छा समय PrimaryKeyColumnहोगा यदि आप एक यूनिडायरेक्शनल संबंध चाहते थे या एक ही आईडी को साझा करने वाले कई टेबल थे।

सामान्य तौर पर यह एक बुरा विचार है और इसके साथ विदेशी प्रमुख संबंधों का उपयोग करना बेहतर होगा JoinColumn

कहा जा रहा है कि, यदि आप एक पुराने डेटाबेस पर काम कर रहे हैं जो इस तरह की प्रणाली का उपयोग करता है तो इसका उपयोग करने के लिए एक अच्छा समय होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.