2016-05-15 2 views
5
  1. बिडरेक्शनल कई से अधिक रिश्तों में मैप्डबी को सेट करने का क्या कारण है?
  2. जब एक टेबल में पर्याप्त मात्रा में रिकॉर्ड होते हैं, जबकि अन्य में कुछ होता है, तो मैप किए जाने के लिए कौन सा पक्ष बेहतर होता है?

उत्तर

1

mappedBy एक बिडरेक्शनल संबंध के दोनों तरफ लिंक करता है। आप संबंध के स्वामी पर mappedBy डालते हैं, इस पर आधारित नहीं है कि कितने रिकॉर्ड हैं (उर्फ ऑब्जेक्ट उन्मुख डिज़ाइन)। आपको यह जानकारी किसी भी जेपीए ट्यूटोरियल और दस्तावेज़ीकरण में मिल जाएगी।

+0

प्रलेखन का कहना है कि मैप किए जाने के लिए कोई अंतर नहीं है, यानी मैं मालिक के रूप में किसी भी पक्ष का चयन कर सकता हूं। मुझे समझ में नहीं आया है कि मैप किए जाने की ज़रूरत क्यों है कई लोगों में। यह कई से एक/एक से कई के लिए स्पष्ट है। मुझे संदेह है कि उत्पादकता पर असर पड़ता है, और यह मेरे प्रश्न के दूसरे भाग का कारण है। – Dmitry

+0

जैसा कि मैंने कहा, एक बिडरेक्शनल संबंध में एक आवश्यकता है। 1-एन, 1-1, एम-एन उस प्रश्न के लिए अपरिवर्तनीय है। कौन सा पक्ष स्वामी को परिभाषित करता है। जेपीए स्पेक –

+0

देखें वास्तव में आप – Jack

8

यह वास्तव में एक अच्छा सवाल है, और यह "स्वामित्व" इकाई की अवधारणा को समझने में मदद करता है। यदि आप join tables रखने से दोनों पक्षों (एक द्विपक्षीय संबंध में) को रोकना चाहते हैं, तो एक अच्छा विचार है, तो आपको एक तरफ mappedBy= तत्व होना चाहिए।

join table@ManyToMany एनोटेशन के mappedBy="name" तत्व द्वारा नियंत्रित किया गया है या नहीं। Javadoc for mappedBy for the ManyToMany annotation says:

वह क्षेत्र जो रिश्ते का मालिक है। जब तक रिश्ते unidirectional नहीं है तब तक आवश्यक है।

अपने (द्विदिश) उदाहरण के लिए, अगर वहाँ केवल दो @ManyToMany एनोटेशन और कोई mappedBy= तत्व थे, डिफ़ॉल्ट दो Entity टेबल और दो Join Tables होगा:

Hibernate: create table SideA (id bigint not null, primary key (id)) 
Hibernate: create table SideA_SideB (sidea_id bigint not null, sidebs_id bigint not null, primary key (sidea_id, sidebs_id)) 
Hibernate: create table SideB (id bigint not null, primary key (id)) 
Hibernate: create table SideB_SideA (sideb_id bigint not null, sideas_id bigint not null, primary key (sideb_id, sideas_id)) 

यह है कि कह रहा है जबकि प्रत्येक इकाई अपने ManyToMany संबंधों का "मालिक" है, अतिरिक्त join table सामान्य उपयोग मामले में अनावश्यक है, और जावाडोक का कहना है कि आपको mappedBy एनोटेशन की आवश्यकता है।

@Entity 
public class SideA { 
    @ManyToMany 
    Set<SideB> sidebs; 
} 
@Entity 
public class SideB { 
    @ManyToMany(mappedBy="sidebs") 
    Set<SideA> sideas; 
} 

के बाद से SideB इकाई नहीं रह गया है इसकी ManyToMany संबंध का मालिक है: यदि मैं SideA "स्वयं" रिश्ता है करने का फैसला, तो मैं mappedBy= तत्व SideB संस्था के लिए है कि यह संबंध का स्वामी नहीं है निर्दिष्ट करने के लिए जोड़ने , अतिरिक्त JoinTable नहीं बनाया जाएगा:

Hibernate: create table SideA (id bigint not null, primary key (id)) 
Hibernate: create table SideB (id bigint not null, primary key (id)) 
Hibernate: create table SideA_SideB (sideas_id bigint not null, sidebs_id bigint not null, primary key (sideas_id, sidebs_id)) 

इस डेवलपर के लिए महत्वपूर्ण है, क्योंकि वह या वह समझना चाहिए जब तक यह इस मामले SideA इकाई में, स्वामित्व इकाई रख दिया जाता है कि कोई रिश्ता नहीं एक समान होती है। हालांकि, चूंकि यह एक द्विपक्षीय संबंध है, इसलिए डेवलपर दोनोंSideA से SideB.sideas और SideB से SideA.sidebs जोड़ना चाहिए।

इसलिए, यदि आप एक bidirectionalManyToMany संबंध है, जिसका अर्थ है आप ManyToMany दोनों शामिल संस्थाओं पर, तो आप एक mappedBy="name" उनमें से एक पर जावाडोक अनुसार जोड़ना चाहिए और एक निरर्थक join table होने से बचाने के लिए है। चूंकि यह द्विपक्षीय है, मुझे नहीं लगता कि यह महत्वपूर्ण है कि आप किस पक्ष को owning इकाई बनाते हैं - यह आपकी एप्लिकेशन प्राथमिकताओं पर निर्भर करता है।

संदर्भ::

What is the difference between Unidirectional and Bidirectional associations? हमेशा की तरह, यह हमेशा एसक्यूएल लॉग सक्षम और देखते हैं कि डेटाबेस में हो रहा है के लिए एक अच्छा विचार है।

What does relationship owner means in bidirectional relationship?

What is the “owning side” in an ORM mapping?

Most efficient way to prevent an infinite recursion in toString()?

+0

संबंध के रिवर्स पक्ष पर 'मैप किए गए' को डालकर दिलचस्प है, ईबीन 4.0.2 प्ले पर! 2.6 मैप किए बिना भी केवल एक टेबल बनाता है किसी भी तरफ से – Luke

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