2010-05-11 18 views
8

मैं एक सामान्य वर्ग भी है कि एक मैप किए गए सुपर वर्ग के लिए एक निजी क्षेत्र है कि एक ही प्रकार के किसी अन्य वस्तु के लिए सूचक रखती है कि करने के लिए एक सूचक के लिए जेपीए एनोटेशन को संभालने के लिए:कैसे एक सामान्य इंटरफ़ेस

@MappedSuperclass 
public abstract class MyClass<T extends MyIfc<T>> 
    implements MyIfc<T> 
    { 

     @OneToOne() 
     @JoinColumn(name = "previous", nullable = true) 
     private T previous; 

      ... 
      } 

मेरी समस्या यह है कि ग्रहण एक फ़ाइल में एक त्रुटि दिखा रहा है, "लक्ष्य इकाई" टी "पिछले के लिए एक इकाई नहीं है।" माईआईएफसी के सभी कार्यान्वयन वास्तव में, संस्थाएं हैं। मुझे यह भी जोड़ना चाहिए कि MyClass से प्राप्त प्रत्येक ठोस कार्यान्वयन टी के लिए एक अलग मान का उपयोग करता है (क्योंकि टी स्वयं है) इसलिए मैं "targetEntity" विशेषता का उपयोग नहीं कर सकता।

मुझे लगता है कि अगर कोई जवाब नहीं है तो मुझे इस जेपीए एनोटेशन को माइक्लास के सभी ठोस उप-वर्गों में ले जाना होगा। यह सिर्फ लगता है जैसे जेपीए/हाइबरनेट को यह समझने के लिए पर्याप्त होना चाहिए कि यह रन-टाइम पर सभी काम करेगा। मुझे आश्चर्य है कि अगर मुझे किसी भी तरह से इस त्रुटि को अनदेखा करना चाहिए।

उत्तर

8

मेरी समस्या यह है कि ग्रहण एक के लिए OneToOne "लक्ष्य इकाई" टी "में फ़ाइल में एक त्रुटि दिखा रहा है, क्योंकि यह एक इकाई नहीं है।"

हाँ, और यहां तक ​​कि अगर T एक Entity, का विस्तार किया गया था मैं हूँ किसी भी जेपीए प्रदाता इस समर्थन के बारे में पता नहीं (कि सिर्फ जेपीए कल्पना का हिस्सा नहीं वैसे भी है)।

नहीं, तुम संस्थाओं सामान्य बनाने के लिए नहीं कर पाएंगे: अधिक प्रतिक्रिया के लिए JPA Generic entities classes Mappedsuperclass are not possible! (EclipseLink के बारे में बहुत समान धागा) पर एक नजर है। प्रदाता जेनेरिक परिभाषा द्वारा परिभाषित विशिष्ट प्रकार के रिश्ते को मैप करने में असमर्थ होगा क्योंकि इस प्रकार को कोड में बनाया गया है जब इकाई को परिभाषित नहीं किया गया है। याद रखें कि जेनेरिक संग्रह को संग्रहित करते समय (इस मामले में) केवल उन प्रकारों तक ही सीमित है। प्रदाता संभवतः प्रति इकाई आवृत्ति के आधार पर इस प्रतिबंधक नहीं हो सकता है। कुछ मामलों में प्रकार बदलने से परिणामस्वरूप पूरी तरह से अलग-अलग तालिकाओं को एक इकाई इकाई के लिए मैप किया जा सकता है और यह निश्चित रूप से समर्थित नहीं है।

+0

पुष्टि है कि यह असंभव है के लिए धन्यवाद। फिर भी एक और कारण है कि कार्यान्वयन विरासत आपके इच्छित तरीके से कभी काम नहीं करती है। मैं अमूर्त सुपरक्लास से जेनेरिक प्रकारों के सभी संदर्भों को हटाने जा रहा हूं और सभी ठोस कार्यान्वयन में उन्हें डुप्लिकेट कर रहा हूं। मुझे आश्चर्य है कि क्या मैं एनोटेशन के बजाय एक्सएमएल मैपिंग फाइलों का उपयोग करना बेहतर कर दूंगा? – HDave

+0

@HDave मैं नहीं सोचता * यह कुछ भी बदलेगा, मैं उम्मीद करता हूं कि आपका जेपीए प्रदाता रनटाइम पर शिकायत करे। –

+0

भले ही मुझे लगता है कि संकलन-प्रकार प्रकार-सुरक्षित इकाई संबंध दिमाग की शांति के लायक नहीं हैं।यह सिर्फ बदबू आ रही है कि मुझे आज कोड के इस स्निपेट को 17 ठोस इकाई कार्यान्वयन में कॉपी करना है! – HDave

2

के बाद से JDO इंटरफ़ेस क्षेत्रों के हठ (जो आप यहाँ क्या करने के लिए एक समान अवधारणा है), और DataNucleus के बाद से जेपीए JDO क्षमताओं के शीर्ष पर बनाया गया है का समर्थन करता है, तो यह संभव है कि आप इस तरह के एक क्षेत्र दृढ़ रहना करने की अनुमति होगी (मेरे पास जेडीओ का उपयोग करने का एक उदाहरण है जो कुछ बहुत समान करता है, लेकिन आपके वर्गों और दृढ़ता कोड के अवशेषों को बिना देखे यह असंभव होना असंभव है)। इसे आज़माएं और देखें कि क्या होता है।

जाहिर है कि इसलिए यदि पोर्टेबिलिटी एक चिंता का विषय आप तो पहली बार एक

+0

वास्तव में मैंने इसे जेपीए के साथ भी आजमाया है और यह भी काम करता है। तो नहीं, यह असंभव नहीं है, जैसा कि अन्य प्रतिक्रिया पर निहित है। यह जेपीए स्पेक से परे है, लेकिन बहुत संभव है। आपको केवल डेटा न्यूक्लियस – DataNucleus

1

आप इस काम करने के लिए अपने क्षेत्र के लिए एक @OneToOne (targetEntity = SuperClassOfT.class) जोड़ सकते हैं लगता है के लिए है, जेपीए कल्पना से परे है।

चेक बाहर How to implement polymorphic JPA entities with generic relations

+0

का उपयोग करने की आवश्यकता है यह सरल चाल केवल तब काम करती है जब SuperClassOfT से शुरू होने वाले पदानुक्रम को एकल-तालिका रणनीति के साथ मैप किया जाता है। अपने लिंक में उदाहरण लेने के लिए, जब तक कि सभी ईवेंट सबक्लास को ईवेंट टेबल में मैप किया जाता है, आप ईवेंट को लक्ष्य के रूप में उपयोग करने के लिए हाइबरनेट को बता सकते हैं और यह सभी लक्षित उदाहरणों को स्टोर/लुकअप करने के लिए ईवेंट तालिका का उपयोग करने का संकेत देगा। लेकिन, उदाहरण के लिए, आप अलग-अलग तालिकाओं पर UserEvent और ApplicationEvent को मैप करना चाहते हैं, मुझे नहीं लगता कि आपके द्वारा प्रस्तावित कार्यवाही काम करेगी। – zakmck

+0

मुझे लगता है कि जुड़ा हुआ टेबल रणनीति भी काम कर सकती है, एक ही तरह से एकल-टेबल करता है, लेकिन मुझे यकीन नहीं है। – zakmck

+0

@zakmck - यह एक उत्कृष्ट बिंदु है! मुझे यकीन नहीं है कि टेबल-प्रति-श्रेणी रणनीति का उपयोग करते समय हाइबरनेट हैंडल सुपरक्लास पर कैसे जुड़ते हैं। उस ने कहा, सामान्य जानकारी केवल जावा वर्गों से संबंधित है, आप जिस अन्य प्रतिबंध के बारे में बात कर रहे हैं वह अभी भी जेनिक्स का उपयोग किए बिना मौजूद होगा, और इसके बजाय स्पष्ट जानवरों पर निर्भर करेगा। – logan

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