Java 使用Morphia和Mongodb持久化和检索地图地图

Java 使用Morphia和Mongodb持久化和检索地图地图,java,mongodb,map,multidimensional-array,morphia,Java,Mongodb,Map,Multidimensional Array,Morphia,我希望能够持久化和检索MongoDB集合中的地图地图。我使用Java通过Morphia访问MongoDB 下面我使用的示例是一个集合,其中包含详细介绍各种汽车车主的文档。在此示例中,特定品牌和型号的车辆数量存储在地图地图中 大多数属性工作时没有遇到任何问题,但对于属性是以下方式定义的映射的映射的情况: @Property("vehicles") private Map<String, Map<String, Integer> vehicles = new HashMap<

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

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

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

@Property("vehicles")
private Map<String, Map<String, Integer> vehicles = new HashMap<String, HashMap<String, Integer>>();
但是,当通过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);
}
queryq=ds.find(Owner.class);
System.out.println(q.countAll());
Iterable i=q.fetch();
业主(o:i){
系统输出打印ln(o);
}
…代码在q.fetch()行以可怕的方式消失


请提供帮助:)

问题源于映射(作为接口)没有默认构造函数,而Morphia在外部映射上为具体HashMap正确分配构造函数时,未能解析内部映射的构造函数。这导致了NullPointerException

经过大量的调试和尝试,最终我(在同事的帮助下)找到了解决方案

  • 不要使用@Property注释,而是使用@Embedded。及
  • 使用具体的HashMap声明映射,而不使用Map接口

    @Embedded("vehicles")
    private HashMap<String, HashMap<String, Integer>> vehicles = new HashMap<String, HashMap<String, Integer>>();
    
    @嵌入式(“车辆”)
    私有HashMap车辆=新HashMap();
    

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

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

private HashMap<String, HashMap<String, OwnDataType>> vehicles = new HashMap<String, HashMap<String, OwnDataType>>();
private HashMap vehicles=new HashMap();
以前的所有建议都不起作用;让morphia正确读取数据的唯一方法是将OwnDataType转换为复数形式,即在OwnDataType内部保留一个映射,而不是在映射内部使用映射:

private HashMap<String, OwnDataTypes> vehicles = new HashMap<String, OwnDataTypes>();
private HashMap vehicles=new HashMap();
现在一切正常

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