2012-01-09 24 views
9

के लिए स्प्रिंग डाटा MongoDB मैं MongoDB में एक संग्रह करने के लिए विभिन्न डेटा स्टोर और उचित क्षेत्र के साथ वसंत डेटा सेम करना चाहते हैं.. वर्ग विरासत

क्षमा करें, मैं छोड़ विवरण है।

जनक सेम:

class A 
    int a 

चाइल्ड्स:

class B extends A 
    double b 

class C extends A 
    String c 

तो, वहाँ मोंगो

{a : 1, b : 2.3, c : "Test"} 

जब मैं डेटा लाने, यह ठीक है में दस्तावेज़ निम्नलिखित है। लेकिन, जब मैं फोन बी के लिए CrudRepository से बचाने विधि, यह सब डेटा का पुनर्लेखन और मैं इस तरह के

update.set("b", newvalue)... 
के रूप में सी

खो

मैं केवल एक अच्छा कस्टम बनाने के वृद्धिशील अद्यतन के साथ विधि सहेजने के लिए विकल्प पता है,

लेकिन प्रतिबिंब के साथ।

क्या आपके पास कोई अन्य विचार है?

अग्रिम धन्यवाद।

+1

क्या आपको 'मोंगो टेम्पलेट' और आपके भंडार के साथ बातचीत पर थोड़ा अधिक वर्बोज़ होना चाहिए? क्या आप डेटा को 'बी' की वस्तु में वापस पढ़ रहे हैं? वास्तव में इसे 'सी' प्रकार की वस्तु वापस करनी चाहिए क्योंकि हमें संग्रहीत प्रकार की जानकारी का पता लगाना चाहिए। इसके अलावा संग्रह मैपिंग जानकारी सहायक होगी। सुनिश्चित करें कि सभी वर्ग एक ही संग्रह में मैप किए गए हैं। –

+0

हाय ओलिवर, आपके उत्तर के लिए धन्यवाद। हां, मैंने अद्यतन क्वेरी का उपयोग करने के लिए 'MongoTemplate' की 'सेव' विधि को ओवरराइड कर दिया है। अब जब मैं 'बी' को सहेजता हूं, तो यह केवल 'बी' फ़ील्ड अपडेट करता है। लेकिन मैं अधिक भयानक समाधान खोजने की कोशिश करता हूं ... –

+0

यदि आप प्रासंगिक कोड स्निपेट जोड़ते हैं तो हम इस मुद्दे को थोड़ा और अधिक कर सकते हैं :) –

उत्तर

5

स्प्रिंग-डेटा मोंगो टेम्पलेट के लिए, आपके ऑब्जेक्ट में फ़ील्ड के अतिरिक्त, अतिरिक्त फ़ील्ड नाम _class भी सहेजा गया है जो टेम्पलेट को बताता है कि यह कौन सा वर्ग सहेज रहा है।
आप विरासत संबंधों के पर ध्यान दिए बिना किसी ऑब्जेक्ट की रिपोजिटरी, का उपयोग करके ऑब्जेक्ट को सही तरीके से सहेजने में सक्षम नहीं होंगे।

वसंत के लिए क्रूड रिपोजिटरी अनिवार्य रूप से जेनेरिक दाओ पैटर्न है। चूंकि आपके सभी दाओ इंटरफ़ेस को कार्यान्वित करते हैं, और सहेजने की विधि है, इसलिए आप यह जानकर किसी भी ऑब्जेक्ट को सहेजने में सक्षम होंगे कि कौन सा दाओ उपयोग करना है।

ऐसा करने के लिए, आप एक रिपोजिटरी फैक्टरी बना सकते हैं जिसका उपयोग आपके भंडार को प्रारंभ करने के लिए किया जाता है, जो एक GetRepository (क्लास प्रकार) फ़ंक्शन प्रदान करता है जो आपको अपनी कक्षा के लिए उचित भंडार प्रदान करता है।

repositoryFactory.getRepository(myType.getClass()).save(myType); 

आप यहाँ और अधिक विस्तार पा सकते हैं:: फिर आप की तरह कुछ करने के लिए सक्षम हो जाएगा http://www.rainydayinn.com/dev/dao-factory-and-generic-dao-wiring-in-spring/

आप एक ही संकलन में अपने सभी वस्तुओं को संग्रहीत करना चाहते हैं, तो आप एनोटेशन @Document उपयोग कर सकते हैं (संग्रह = "mycollection")। यदि आप संग्रह का नाम नहीं देते हैं, तो डिफ़ॉल्ट वर्ग वर्ग के अनुसार प्रत्येक वर्ग को एक अलग संग्रह में सहेजना है।

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