java - 使用 Morphia 和 Mongodb 持久化和检索 map map

标签 java mongodb map multidimensional-array morphia

我希望能够持久保存和检索 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/

相关文章:

java - Spring 启动: How to skip basic-auth for particular endpoint

java - Java中Bean类的继承

java - 主要错误无法找到记录器配置 "test"的附加程序 "test"

node.js - 将我的 noSQL(mongoDB) 数据库与我的 NodeJS 项目连接起来。但它工作得不好

STL - STL map::find 函数在没有相等运算符的情况下如何工作?

C++ map::find char * 与 char []

Java 类实现接口(interface)错误

javascript - MongoDB聚合: Replacing an array of IDs with the corresponding objects from an array in the same document

mongodb - 如何在 MongoDB 中杀死死游标

map - Openlayer 3 坐标