2012-12-14 10 views
7

में गैर प्राथमिक कुंजी कॉलम वाले टेबल में शामिल हों मैं विरासत प्रणाली पर काम कर रहा हूं, डेटाबेस से कुछ जानकारी पढ़ने की जरूरत है।
VendorContactBridge (bridgeId -pk, vendorEid, contactEid)
संपर्क (contactId -pk, contactEid, फोन)कई एसोसिएशन में से एक - जेपीए

vendorEid और contactEid - नीचे दी गई तालिका संबंध

विक्रेता (pk, vendorEid, नाम vendorId) कर रहे हैं तालिका की प्राथमिक कुंजी नहीं है लेकिन तालिका में शामिल हों VendorContactBridge में कॉलम में शामिल होने के रूप में उपयोग किया जाता है।

विक्रेता इकाई -

@Entity 
@Table(name="Vendor") 
public class Vendor implements Serializable{ 

@Id 
@Column(name="VENDORID") 
private BigDecimal vendorId; 

@Column(name="VENDOREID") 
private BigDecimal vendorEid; 

@OneToMany(fetch = FetchType.EAGER) 
@JoinTable(name="VENDORCONTACTBRIDGE", 
joinColumns={@JoinColumn(name="VENDOREID", referencedColumnName="VENDOREID")}, 
inverseJoinColumns={@JoinColumn(name="CONTACTEID", referencedColumnName="CONTACTEID")}) 
private Set<Contact> vendorContact; 
} 

संपर्क इकाई -

@Entity 
@Table(name="CONTACT") 
public class Contact implements Serializable{ 

@Id 
@Column(name="CONTACTID") 
private BigDecimal contactId; 

@Column(name="CONTATEID") 
private BigDecimal contactEId; 

@ManyToOne 
@JoinTable(name="VENDORCONTACTBRIDGE", 
joinColumns={@JoinColumn(name="CONTACTEID", referencedColumnName="CONTATEID")}, 
inverseJoinColumns={@JoinColumn(name="VENDOREID", referencedColumnName="VENDOREID")}) 
private Vendor vendor; 
} 

जबकि क्वेरी चलाने, अपवाद नीचे हो रही

SecondaryTable JoinColumn एक गैर प्राथमिक कुंजी संदर्भ नहीं दे सकता।

मैंने विक्रेता इकाई में दिए गए उत्सुक fetch को हटा दिया, मुझे कोई अपवाद नहीं मिला है लेकिन यह संग्रह लोड नहीं करता है। एसोसिएशन के साथ क्या गलत है?

उत्तर

10

पृष्ठ पर JPA 2.0 specs पैराग्राफ 11.1.21 JoinColumn annotaion के अनुसार संदर्भित कॉलम कि संदर्भित तालिका के प्राथमिक कुंजी कॉलम नहीं हैं के लिए 379

समर्थन वैकल्पिक है। ऐसे मैपिंग का उपयोग करने वाले अनुप्रयोग पोर्टेबल नहीं होंगे।

ऐसा लगता है कि हाइबरनेट इस वैकल्पिक भाग को लागू नहीं करना चुनता है। अन्य कार्यान्वयन हो सकता है। मैंने इसे ग्रहण लिंक पर आज़माया लेकिन वह कोई भी काम नहीं करता है (यह सत्यापन विफल रहता है)।

मुझे दो कार्य चारों ओर देखते हैं। एक प्राथमिक कुंजी का उपयोग करने के लिए अपनी स्कीमा को समायोजित करना है जो डेटाबेस डिज़ाइन सिद्धांत परिप्रेक्ष्य से सही बात होगी। हालांकि यह इस स्कीमा के आधार पर अन्य सॉफ़्टवेयर की वजह से एक विकल्प नहीं हो सकता है जो विकल्प दो छोड़ देता है। जेपीए में रिश्ते को कम करने के द्वारा इसके आसपास काम करें, केवल ईद का उपयोग करें और प्रासंगिक वस्तुओं को स्वयं प्राप्त करें।

+0

विकल्प 2: क्या आप मतलब है, मैं दो डाटाबेस VendorEid और दोबारा के आधार पर VendorContactBridge से ContactEid हो रही पर संपर्क ContactEid पर ased के लिए एक फोन करना चाहिए? क्या मेरी समझ सही है? – Pankaj

+0

वह मूल प्रिंसिपल होगा। लेकिन मूल क्वेरी का उपयोग करना सबसे अच्छा होगा क्योंकि आप शामिल होने में सक्षम होंगे और इस प्रकार वस्तुओं को पुनर्प्राप्त करने के लिए एक एकल SQL क्वेरी का उपयोग करें। – Eelke

संबंधित मुद्दे