2012-09-10 22 views
5

Diğer şeylerin yanı sıra MongoDB koleksiyonundaki haritaların bir haritasını kalıcı hale getirip geri almak istiyorum. Morphia aracılığıyla MongoDB'ye erişmek için Java kullanıyorum.Morphia ve Mongodb ile Haritaların Haritasının Kalıcı Hale Getirilmesi ve Geri Alınması

Aşağıda kullandığım örnek, çeşitli araçların sahiplerini detaylandıran belgeleri içeren bir koleksiyon. Bu örnekte, belirli bir marka ve modele ait araçların sayısı, bir harita haritasında saklanır.

Özelliklerin çoğu, sorun yaşanmadan çalışmaktadır, ancak bir özelliğin, tanımlanmış bir haritanın bir haritası olması durumunda şu şekilde:

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

nesne oluşturulur (bazı değerler haritası takılan) ve bir olmasını beklediğiniz gibi Mongo veritabanına kalıcıdır:

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

nesnedir Ancak zaman java koduyla alındı ​​(MongoDB co üzerinde bir sorgu nsole kodu q.fetch() on line korkunç bir şekilde ölür ... ... şu şekilde)) olarak beklenen işleri

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); 
} 

.

yardım edin :)

cevap

7

sorunu Harita (bir arayüz olmak üzere) bir varsayılan kurucu yok olmasından kaynaklanıyor ve Morfin doğru dış Harita Üzerinde beton HashMap için yapıcı atama iken İç Harita için bir kurucu çözmek için başarısız oldu. Bu NullPointerException ile sonuçlandı.

Çok fazla hata ayıklama işleminden sonra ve bunu denedikten sonra, sonuçta çözüm için bir meslektaşının yardımıyla tökezledim.

  • @Property ek açıklamasını kullanmak yerine @Embedded kullanın. ve
  • ... merak olanlarınız için Harita arayüzünü

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

kullanmak @property veya @Embedded birinde beton sınıfını belirterek beton HashMap kullanarak haritalar beyan değil ek açıklama, iç HashMap için kurucuyu çözmeye yardımcı olacak hiçbir şey yapmadı.

2

biz kendi veri türü

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

önceki tüm önerileri işe yaramadı bu şekilde kullanıyorlardı yana;

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

Şimdi her şey çalışıyor ince: verileri düzgün okuma tek şey yapmadan morphia o OwnDataType kendisi içinde bir harita tutarak ve haritaların içindeki haritalar kullanmıyor, çoğul forma OwnDataType dönüşümü oldu.

İlgili konular