6

我希望能够持久保存和检索 MongoDB 集合中的地图地图等。我正在使用 Java 通过 Morphia 访问 MongoDB。

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

大多数属性都可以正常工作,没有遇到任何问题,但是对于属性是按以下方式定义的映射的映射的情况:

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

该对象被创建(一些值插入到地图中)并保存到 Mongo 数据库中,正如人们所期望的那样:

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

但是,当通过 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);
}

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

请帮忙 :)

4

2 回答 2

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

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

于 2012-09-11T08:18:51.007 回答
2

由于我们以这种方式使用我们自己的数据类型

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

以前的所有建议都不起作用;唯一使 morphia 正确读取数据的方法是将 OwnDataType 转换为复数形式,即在 OwnDataType 本身内保留一个地图,而不是在地图内使用地图:

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

现在一切正常。

于 2015-06-10T11:15:52.643 回答