2012-03-12 10 views
42

मैं PostgreSQL और JPA के साथ प्ले फ्रेमवर्क 1.2.4 का उपयोग कर रहा हूं। मैं एक मॉडल पदानुक्रम चाहता हूं और देख सकता हूं कि ऐसा करने के कुछ विकल्प हैं।जेपीए: मॉडल पदानुक्रम कार्यान्वित करना - @ मैप्डसुपरक्लास बनाम @ विरासत

मेरे पास एक बेस क्लास (जो सार है) और दो ठोस वर्ग इस बेस क्लास को विस्तारित करते हैं। मैं इस कक्षा वर्ग को जारी रखना नहीं चाहता हूं जबकि मैं ठोस कक्षाएं बनाना चाहता हूं। बेस क्लास में, मेरे पास गुणों के रूप में एक और मॉडल वर्ग हैं, दूसरे शब्दों में, मेरे पास @ManyToOne मेरे बेस क्लास में रिश्ते हैं।

मेरा प्रश्न यह है कि इसे लागू करने का सबसे अच्छा तरीका क्या है? @MappedSuperclass या @Inheritance का उपयोग TABLE_PER_CLASS रणनीति के साथ करना? मैं थोड़ा उलझन में हूं क्योंकि वे लगभग समकक्ष लगते हैं।

मुझे भविष्य में पूछताछ और प्रदर्शन समस्याओं के बारे में कुछ चिंताएं भी हैं।

+1

मैंने '@ विरासत 'को' @ विरासत 'में बदल दिया है क्योंकि मुझे लगता है कि यह एक टाइपो था। –

उत्तर

96

मैप्डसुपर क्लास का उपयोग गुणों, संघों और विधियों के उत्तराधिकारी के लिए किया जाना चाहिए।

आपके पास एक इकाई है, और कई उप-इकाइयों के दौरान इकाई विरासत का उपयोग किया जाना चाहिए।

आप बता सकते हैं कि आपको इस प्रश्न का उत्तर देकर एक या दूसरे की आवश्यकता है: क्या मॉडल में कोई अन्य इकाई है जो बेस क्लास के साथ सहयोग कर सकती है?

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

उदाहरण के लिए: एसएमएस संदेश, ईमेल संदेश, या फ़ोन संदेशों को:

  • आप संदेशों के कई प्रकार के हो सकते हैं। और एक व्यक्ति के पास संदेशों की एक सूची है। संदेश के बावजूद, आप किसी संदेश से जुड़े अनुस्मारक भी प्राप्त कर सकते हैं। इस मामले में, संदेश स्पष्ट रूप से एक इकाई है, और इकाई विरासत का उपयोग किया जाना चाहिए।
  • आपके सभी डोमेन ऑब्जेक्ट्स में सृजन तिथि, संशोधन दिनांक और आईडी हो सकती है, और इस प्रकार आप उन्हें आधार सारडोमेन ऑब्जेक्ट क्लास से प्राप्त कर सकते हैं। लेकिन किसी भी इकाई के पास कभी भी AbstractDomainObject से कोई संबंध नहीं होगा। यह हमेशा एक और विशिष्ट इकाई के लिए एक सहयोग होगा: ग्राहक, कंपनी, जो भी हो। इस मामले में, मैप किए गए सुपरपर क्लास का उपयोग करना समझ में आता है।
+0

आपके उत्तर के लिए बहुत धन्यवाद। अब मैं स्पष्ट हूं कि अगर मुझे एक इकाई के रूप में बेस क्लास को जारी रखने या उपयोग करने की आवश्यकता है तो मुझे इकाई विरासत का उपयोग करना चाहिए। मुझे आश्चर्य है कि प्रश्नों पर विशेष रूप से विरासत वाले ऑब्जेक्ट रिलेशनशिप का उपयोग करके प्रदर्शन या प्रतिबंध के साथ कोई समस्या है? – huzeyfe

+0

यह सब इस बात पर निर्भर करता है कि आप किस प्रकार की विरासत चुनते हैं, और कौन सी विरासत रणनीति है। –

+0

मेरे मामले में (जैसा कि मैं बेस क्लास जारी रखना नहीं चाहता) मैप्डसुपर क्लास अधिक उपयुक्त प्रतीत होता है। तो प्रदर्शन और प्रतिबंधों के संदर्भ में मुझे कुछ निश्चित मुद्दों से अवगत होना चाहिए? – huzeyfe

2

जैसा कि मैंने this article में बताया गया है, @MappedSupperclass@Inheritance एनोटेशन से अलग है।

@MappedSuperclass जेपीए प्रदाता को बेस क्लास निरंतर गुणों को शामिल करने के लिए कहता है जैसे कि उन्हें @MappedSuperclass के साथ एनोटेटेड सुपरक्लास का विस्तार करने वाले बाल वर्ग द्वारा घोषित किया गया था।

हालांकि, विरासत केवल ओओपी दुनिया में दिखाई दे रही है, क्योंकि डेटाबेस परिप्रेक्ष्य से, बेस क्लास का कोई संकेत नहीं है। केवल बाल वर्ग इकाई में एक संबद्ध मैप की गई तालिका होगी।

@Inheritance एनोटेशन डेटाबेस तालिका संरचना में ओओपी विरासत मॉडल को मूर्त रूप देने के लिए है। अधिक, आप @Inheritance के साथ एनोटेटेड बेस क्लास से पूछ सकते हैं लेकिन आप @MappedSuperclass के साथ एनोटेटेड बेस क्लास के लिए ऐसा नहीं कर सकते हैं।

अब, आप @Inheritance JPA annotation is to implement behavior-driven patterns like the Strategy Pattern का उपयोग क्यों करना चाहते हैं।

दूसरी तरफ, @MappedSuperclass एक मूल आधार वर्ग का उपयोग कर मूल गुणों, संघों और यहां तक ​​कि इकाई @Id दोनों का पुन: उपयोग करने का एक तरीका है। फिर भी, आप @Embeddable प्रकार का उपयोग करके लगभग एक ही लक्ष्य प्राप्त कर सकते हैं। एकमात्र बड़ा अंतर यह है कि आप @Id परिभाषा का उपयोग @Embeddable के साथ नहीं कर सकते हैं, लेकिन आप इसे @MappedSuperclass के साथ कर सकते हैं।

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