2011-12-20 10 views
8

@JoinColumn एनोटेशन के साथ तालिका में शामिल होने के संबंध में अक्षम होने की संभावना है। डिफ़ॉल्ट एक जॉइन टेबल है।OneToMany - तालिका और विदेशी कुंजी में शामिल होने के बीच अंतर क्या हैं?

उदाहरण के लिए उत्पादन प्रणाली के फायदे और नुकसान क्या हैं?
मुझे एक जॉइन टेबल का उपयोग कब करना चाहिए और कब नहीं?

धन्यवाद।

+0

1: एन संबंध में संबंध तालिका का उपयोग करने की कोई आवश्यकता नहीं है। अधिक सटीक पूछो। –

+0

डिफ़ॉल्ट रूप से @OneToMany मैपिंग एक जॉइन टेबल बनाता है। मुझे नहीं पता कि डिफ़ॉल्ट विदेशी कुंजी के साथ मैपिंग क्यों नहीं कर रहा है ... –

+1

मेरा अनुमान है कि यह प्रदर्शन या ड्रॉ बैक के लिए नहीं है, लेकिन क्योंकि जेपीए आम तौर पर मानता है कि तालिका के भीतर सभी फ़ील्ड इसी इकाई के भीतर मैप किए जाते हैं। यह एक बढ़त मामला है क्योंकि OneToMany के साथ OneToMany के साथ यह अधिक आम है। Unidirectional OneToMany के साथ joincolumn का उपयोग करके, यह आवश्यक है कि बच्चे की तालिका में एक विदेशी कुंजी हो, लेकिन बच्चे की इकाई के माता-पिता का संदर्भ नहीं है। – Chris

उत्तर

16

डिफ़ॉल्ट रूप से @OneToMany केवल एक जॉइन टेबल तैयार करेगा यदि आप यूनिडायरेक्शनल रिलेशनशिप का उपयोग करेंगे।

दूसरे शब्दों में, यदि आप Employee और Project संस्थाओं है और Employee इकाई परिभाषित किया गया है के रूप में इस प्रकार है (मान है इन संस्थाओं के लिए कोई orm.xml प्रविष्टियों):

@Entity 
public class Employee { 
    // ... 

    @OneToMany 
    Set<Project> projects; 
} 

@Entity 
public class Project { 
    // ... 
} 

जेपीए प्रदाता पैदा करेगा में एक जॉइन टेबल (नोटिस mappedBy एट्रिब्यूट @OneToMany एनोटेशन में Employee इकाई Project से कोई संदर्भ नहीं है)।

दूसरी ओर, यदि आप द्विदिश रिश्ते का उपयोग करेंगे:

@Entity 
public class Employee { 
    // ... 

    @OneToMany(mappedBy="employee") 
    Set<Project> projects; 
} 

@Entity 
public class Project { 
    // ... 

    @ManyToOne 
    Employee employee; 
} 

में शामिल होने की मेज, इस्तेमाल किया जा नहीं होगा के रूप में वहाँ "कई" पक्ष इस रिश्ते के लिए विदेशी कुंजी संग्रहीत करने में इस्तेमाल किया जाएगा।

हालांकि, जब आप बिडरेक्शनल @OneToMany परिभाषित mappedBy विशेषता के साथ संबंध रखते हैं तो आप उन मामलों में भी शामिल होने के लिए मजबूर कर सकते हैं। आप रिश्ते के स्वामित्व वाले पक्ष पर @JoinTable एनोटेशन का उपयोग कर इसे प्राप्त कर सकते हैं।

जैसा कि आपने उल्लेख किया है, @JoinColumn का उपयोग करने के लिए, जहां तालिका में डिफ़ॉल्ट रूप से उपयोग किया जाएगा (यूनिडायरेक्शनल @OneToMany संबंध) का उपयोग करने की संभावना भी है।

एफके का परीक्षण करना और अपने लिए टेबल प्रदर्शन अंतर में शामिल होना सबसे अच्छा है। मैं बस अनुमान लगा सकता हूं कि कम जुड़ाव (इस मामले में: एफके) में बेहतर प्रदर्शन होता है।

इसके अलावा, कभी-कभी डीबीए डेटाबेस स्कीमा को परिभाषित करता है और आपको केवल मौजूदा स्कीमा में अपने मैपिंग को फिट करने की आवश्यकता होती है। फिर आपके पास एफके पर कोई विकल्प नहीं है या टेबल में शामिल नहीं है - यही कारण है कि आपके पास कोई विकल्प है।

+0

हाइबरनेट इसके बारे में स्पष्ट है: "तालिका में शामिल होने वाले कई लोगों के लिए एक यूनिडायरेक्शनल एक बहुत पसंद किया जाता है। इस एसोसिएशन को @ जॉइनटेबल के माध्यम से वर्णित किया गया है।" http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#d0e1168 खंड "2.2.5.3.1.3। तालिका में शामिल होने के साथ यूनिडायरेक्शनल" – lko

0

पॉलिमॉर्फिज्म के लिए तालिकाओं की आवश्यकता है। उदाहरण के लिए, यदि कर्मचारी और प्रबंधक एक ही प्रोजेक्ट को लिंक करते हैं और वे एक-टेबल-प्रति-श्रेणी रणनीति के साथ मैप किए जाते हैं, संबंध डीबी स्तर पर, उस परियोजना को जानने का एकमात्र तरीका (आईडी = 1, emp_id = 10) प्रबंधक को संदर्भित करता है प्रबंधक_2_employee तालिका में emp_id डालना है। अगर कोई ऐसी स्थिति में नहीं है, तो emp_id सीधे परियोजना में जा सकता है।

+0

तालिका में शामिल होने के फायदे देखें http://stackoverflow.com/प्रश्न/1307203/हाइबरनेट-दिशाहीन-एक-से-कई-संघ-क्यों-है-एक में शामिल होने की मेज-बेहतर –

0

जैसा ऊपर बताया गया है, डिफ़ॉल्ट रूप से हाइबरनेट तालिका में शामिल होने के लिए जाता है। यह बेहतर डीबी सामान्यीकरण में परिणाम देता है।

यदि कोई विकल्प है, तो SQL क्वेरी में अतिरिक्त तालिका में शामिल होने की आवश्यकता के रूप में जॉइनकॉलम शामिल तालिका पर बेहतर प्रदर्शन देता है।

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