2012-09-10 26 views
5

के साथ मैप्स का नक्शा स्थायी और पुनर्प्राप्त करना मैं मोंगोडीबी संग्रह में मानचित्रों का नक्शा, अन्य चीजों के साथ, लगातार और पुनर्प्राप्त करने में सक्षम होना चाहता हूं। मैं मॉर्फिया के माध्यम से मोंगोडीबी तक पहुंचने के लिए जावा का उपयोग कर रहा हूं।मोर्फिया और मोंगोड

उदाहरण का उपयोग मैं नीचे कर रहा हूं एक संग्रह है जिसमें विभिन्न कारों के मालिकों का विवरण देने वाले दस्तावेज़ शामिल हैं। इस उदाहरण में एक विशिष्ट मेक और मॉडल के वाहनों की संख्या नक्शे के मानचित्र में

अधिकांश गुण किसी भी समस्या का अनुभव नहीं कर रहे हैं, लेकिन ऐसे मामले के लिए जहां एक संपत्ति परिभाषित नक्शा का नक्शा है निम्नलिखित तरीके से:

@Property("vehicles") 
private Map<String, Map<String, Integer> vehicles = new HashMap<String, HashMap<String, Integer>>(); 

वस्तु बनाई गई है (कुछ मान मानचित्र में डाला) और मोंगो डेटाबेस के लिए कायम रूप में भी इसे होने की अपेक्षा करेंगे:

"vehicles" : { 
    "FORD" : { 
     "FIESTA" : 1 
    }, 
    "TOYOTA" : { 
     "COROLLA" : 1,     
     "PRIUS": 1 
    }, 
    "BMW" : { 
     "SLK" : 1 
    } 
} 

लेकिन जब वस्तु है जावा कोड के माध्यम से पुनर्प्राप्त (मोंगोडीबी सह पर एक प्रश्न nsole निम्नलिखित तरीके से के रूप में की उम्मीद काम करता है)) ...

Query<Owner> q = ds.find(Owner.class);  
System.out.println(q.countAll()); 
Iterable<Owner> i = q.fetch(); 
for (Owner o : i) { 
    System.out.println(o); 
} 

... कोड q.fetch() लाइन पर एक भयानक तरह से मर जाता है।

मदद कृपया :)

उत्तर

7

मुद्दा इस तथ्य की वजह से उपजी है कि एक नक्शा (एक अंतरफलक जा रहा है) एक डिफ़ॉल्ट निर्माता नहीं है, और अफ़ीम का सत्त्व सही ढंग से बाहरी मानचित्र उस पर ठोस HashMap के लिए निर्माता बताए था, जबकि आंतरिक मानचित्र के लिए एक कन्स्ट्रक्टर को हल करने में विफल रहा था। इसके परिणामस्वरूप NullPointerException में परिणाम हुआ था।

बहुत सारे डिबगिंग के बाद और यह कोशिश करने के बाद, अंततः मैंने समाधान पर (सहयोगी की मदद से) ठोकर खाई।

  • @Property एनोटेशन उपयोग @Embedded का उपयोग करने के बजाय। और
  • ठोस HashMap का उपयोग करके नक्शे घोषित और न मानचित्र इंटरफ़ेस

    @Embedded("vehicles") 
    private HashMap<String, HashMap<String, Integer>> vehicles = new HashMap<String, HashMap<String, Integer>>(); 
    

का उपयोग आप में से जो लोग सोच रहे हैं के लिए ... या तो @Property या @Embedded में ठोस वर्ग को निर्दिष्ट एनोटेशन ने आंतरिक हैश मैप के लिए कन्स्ट्रक्टर को हल करने में मदद करने के लिए कुछ भी नहीं किया।

2

के बाद से हम अपने ही डेटाप्रकार इस तरह

private HashMap<String, HashMap<String, OwnDataType>> vehicles = new HashMap<String, HashMap<String, OwnDataType>>(); 

सभी पिछले सिफारिशों काम नहीं किया उपयोग कर रहे थे; केवल एक चीज बनाने अफ़ीम का सत्त्व डेटा ठीक से पढ़ने बहुवचन रूप को OwnDataType को बदलने के लिए था, कि OwnDataType ही अंदर एक नक्शा बना रहा और नक्शे के अंदर नक्शे का इस्तेमाल नहीं:

private HashMap<String, OwnDataTypes> vehicles = new HashMap<String, OwnDataTypes>(); 

अब सब कुछ ठीक काम कर रहा है।