2012-09-10 32 views
5

我希望能夠在MongoDB集合中持久保存和檢索地圖的地圖。我正在使用Java通過Morphia訪問MongoDB。使用Morphia和Mongodb持久保存和檢索地圖的地圖

我在下面使用的示例是一個集合,其中包含詳細說明各種汽車所有者的文檔。在此示例中,特定品牌和型號的車輛數量存儲在地圖地圖中

大多數屬性都可以正常工作,但是對於屬性是定義的地圖地圖的情況以下列方式:

@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 
    } 
} 

然而,當該對象是通過java代碼檢索(MongoDB co。上的查詢) 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未能解析內部Map的構造函數。這導致了NullPointerException。

經過大量調試並嘗試完成後,最終我偶然發現(在同事的幫助下)解決方案。

  • 而不是使用@Property註釋use @Embedded。和
  • 使用的具體的HashMap聲明地圖,而不是使用Map接口

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

對於那些你們誰知道...無論是在@Property或@Embedded指定具體類註解沒有幫助解決內部HashMap的構造函數。

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

現在一切工作正常。