使用Morphia和Mongodb保持和检索地图地图

Ron*_*fin 5 java map multidimensional-array mongodb morphia

我希望能够在MongoDB集合中持久存储并检索地图图.我正在使用Java通过Morphia访问MongoDB.

我在下面使用的示例是一个集合,其中包含详细说明各种车辆所有者的文档.在该示例中,特定品牌和型号的车辆数量存储在地图地图中

大多数属性都没有遇到任何问题,但对于属性是以下列方式定义的地图的映射:

@Property("vehicles")
private Map<String, Map<String, Integer> vehicles = new HashMap<String, HashMap<String, Integer>>();
Run Code Online (Sandbox Code Playgroud)

创建对象(一些值插入到地图中)并持久保存到Mongo数据库,就像人们期望的那样:

"vehicles" : {
    "FORD" : {
        "FIESTA" : 1
    },
    "TOYOTA" : {
        "COROLLA" : 1,                  
        "PRIUS": 1
    },
    "BMW" : {
        "SLK" : 1
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当通过java代码检索对象时(MongoDB控制台上的查询按预期工作))以下列方式...

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);
}
Run Code Online (Sandbox Code Playgroud)

......代码在q.fetch()行上以可怕的方式死亡.

请帮忙 :)

Ron*_*fin 8

问题源于Map(作为接口)没有默认构造函数,而Morphia在外部Map上正确分配具体HashMap的构造函数,因此无法解析内部Map的构造函数.这导致了NullPointerException.

经过大量的调试并尝试了这一点,最终我(在同事的帮助下)绊倒了解决方案.

  • 而不是使用@Property注释使用@Embedded.和
  • 使用具体的HashMap声明地图,而不使用Map接口

    @Embedded("vehicles")
    private HashMap<String, HashMap<String, Integer>> vehicles = new HashMap<String, HashMap<String, Integer>>();
    
    Run Code Online (Sandbox Code Playgroud)

对于那些想知道的人...在@Property或@Embedded注释中指定具体类没有帮助解析内部HashMap的构造函数.