java - Retrieve only the superclass from a class hierarchy -
मेरे पास निम्न के रूप में कोई परिदृश्य है:
@Entity @Table (name = " जानवर ") @Inheritance (रणनीति = InheritanceType.JOINED) सार्वजनिक वर्ग पशु लागू करता Serializable {@Id @GeneratedValue (रणनीति = GenerationType.SEQUENCE, जनरेटर =" S_ANIMAL ") @SequenceGenerator (नाम =" S_ANIMAL ", sequenceName =" S_ANIMAL ", आवंटनआकार = 1) सार्वजनिक int getNumero () {वापसी संख्या; } सार्वजनिक शून्य सेट न्यूमेरो (इंट नंबर) {this.numero = numero; } । । } और उपवर्ग के रूप में:
@Entity @Table (नाम = "कुत्ता") सार्वजनिक वर्ग कुत्ता पशु {फैली निजी स्थिर अंतिम लंबे serialVersionUID = -7341592543130659641L; । । । } मेरे पास एक जेपीए चुनें बयान इस प्रकार है:
पशु से एक चुनें; मैं हाइबरनेट 3.3.1 का उपयोग कर रहा हूं
जैसा कि मैंने देख सकता हूँ कि ढांचे को पशु और कुत्तों के उदाहरण भी मिलते हैं एक बाएं बाहरी जुड़ने का उपयोग करना क्या केवल "भाग" पशु का चयन करने का कोई तरीका है? मेरा मतलब है, पिछले चुनें को सभी पशु s मिलेगा, जो कि केवल पशु s लेकिन dog नहीं हैं और कुत्ते s। मैं उन सबको चाहता हूं, लेकिन कुत्ते s के मामले में मैं केवल "पशु भाग को पुनः प्राप्त करना चाहता हूं "उनमें से। मैं @ org.hibernate.annotations.Entity (बहुरूपता = PolymorphismType.EXPLICIT) पाया लेकिन जैसा कि मैंने यह केवल काम करता है देख सकते हैं यदि पशु एक नहीं है @ एंटीटी । बहुत बहुत धन्यवाद।
संक्षिप्त उत्तर: आपके द्वारा वर्णित व्यवहार जेपीए मानक के अनुरूप है। जेपीए प्रदाता को केवल सुपर क्लास को प्राप्त करने के लिए प्रतिबंधित करने के लिए कोई जेपीए मानक तरीका नहीं है।
प्रदाता कार्यक्षमता, स्थिरता प्राप्त करने के लिए क्वेरी कार्यान्वयन तर्क चुन सकता है; प्रदर्शन। जब तक यह आपकी इकाई टिप्पणियों का सम्मान करता है और क्वेरी में अनुरोधित जानकारी लौटाता है, यह सब ठीक है। व्यक्तिगत कार्यान्वयन विवरण के रूप में कुत्ते में शामिल होने के बारे में सोचें, जो आपको चिंता नहीं करनी चाहिए। प्रदाता ने प्रदर्शन और स्थिरता की सहायता के लिए एक बाहरी शामिल किया है।
पर विचार करें:
- जेपीए जावा वस्तु संस्थाओं पर काम करने परिभाषित किया गया है नहीं तालिकाओं
- अपनी इकाई पदानुक्रम, पशु की जड़, नहीं सार है, इसलिए आप एक उदाहरण बना सकते हैं और इसे जारी रख सकते हैं
- आप और पशु @DescriminatorColumn लिए एक डिफ़ॉल्ट मान @DescriminatorType है - इसलिए पशु तालिका एक discriminator कॉलम होगा नाम "DTYPE" और प्रकार "कुछ स्ट्रिंग प्रकार" के साथ जोड़ा। आपके पास @ डिस्मुमिनेटर वैल्यू के लिए एक डिफ़ॉल्ट मान है - इकाई नाम के बराबर होगा: पशु तो पशु। DTYPE स्तंभ = "पशु" जब आप यह इकाई बनाते हैं।
- इकाई कुत्ते के पास एक सुपर वर्ग वाला जानवर है इसके डिफ़ॉल्ट डिस्काउंट का उपयोग इसके @ डिस्केमिनेटर वैल्यू - डॉग के लिए भी किया जाता है। तो पशु। DTYPE स्तंभ = "कुत्ता" जब आप इस इकाई को बनाते हैं।
- जावा वर्ग प्रतिबंध यह सुनिश्चित करते हैं कि जब भी कोई कुत्ते वस्तु मौजूद हो, तब भी इसी पशु सुपरक्लस ऑब्जेक्ट मौजूद है।
- अक्सर जब आप एक इकाई पशु एक @DescriminatorValue (मूल्य DTYPE स्तंभ में संग्रहीत) के साथ, जेपीए हठ संदर्भ में लोड = "डॉग", तो यह बहुत उपयोगी डॉग वस्तु पीसी में लोड करने के लिए है स्थिरता के लिए। हालांकि यह जेपीए मानक के लिए जरूरी नहीं है।
- विरासत के संबंध EAGER या LAZY (एक बुनियादी प्रकार क्षेत्र या इकाई संबंध क्षेत्र की तरह) के लिए निर्दिष्ट नहीं किया जा सकता है। यदि आपको कुत्ता गुणों को पढ़ने / अपडेट करने की आवश्यकता है और कुत्ते वर्ग को लोड नहीं किया गया था, तो आप क्या करेंगे? इसे पुनः लोड करने के लिए एक अलग क्वेरी चलाएं? यह सुसंगतता और प्रदर्शन को बहुत नुकसान पहुंचाएगा।
- प्रदर्शन के लिए मुख्य चिंता डीबी को भेजे गए अलग एसक्यूएल कमांड की कुल संख्या है।
समय के लिए लिया गया: पशु तालिका के साथ प्रश्न केवल थोड़ा तेज है (10 एस माइक्रोसॉन्ड्स ???) जानवर से पूछताछ से कुत्ते में शामिल हो गया है, लेकिन दो अलग-अलग प्रश्नों (एक जानवर के लिए और एक कुत्ते के लिए) की तुलना में बहुत तेज है
Comments
Post a Comment