gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:34:09 29 4
gpt4 key购买 nike

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com