我希望能够持久保存和检索 MongoDB 集合中的 map 等内容。我正在使用 Java 通过 Morphia 访问 MongoDB。
我在下面使用的示例是一个集合,其中包含详细说明各种汽车所有者的文档。在此示例中,特定品牌和型号的车辆数量存储在 map map 中
大多数属性都可以正常工作,没有遇到任何问题,但对于属性是按以下方式定义的 map 的 map 的情况:
@Property("vehicles")
private Map<String, Map<String, Integer> vehicles = new HashMap<String, HashMap<String, Integer>>();
对象被创建(一些值被插入到 map 中)并被持久化到 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() 行上以一种可怕的方式死掉。
请帮忙:)
最佳答案
问题源于 Map(作为接口(interface))没有默认构造函数,而 Morphia 正确地为外部 Map 上的具体 HashMap 分配构造函数,但未能解析内部 Map 的构造函数 map 。这导致了 NullPointerException。
经过大量调试和尝试这个和那个,最终我(在同事的帮助下)偶然发现了解决方案。
- 不要使用@Property 注解,而是使用@Embedded。和
使用具体的 HashMap 声明映射,而不使用 Map 接口(interface)
@Embedded("vehicles") private HashMap<String, HashMap<String, Integer>> vehicles = new HashMap<String, HashMap<String, Integer>>();
对于那些想知道的人...在@Property 或@Embedded 注释中指定具体类对解析内部HashMap 的构造函数没有任何帮助。
关于java - 使用 Morphia 和 Mongodb 持久化和检索 map map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12350458/