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

この問題は、マップ(インターフェイスである)にデフォルトのコンストラクターがなく、Morphiaが外部マップの具象HashMapのコンストラクターを正しく割り当てていたときに、内部マップのコンストラクターを解決できなかったことが原因です。これにより、NullPointerExceptionが発生していました。

多くのデバッグとこれとそれを試した後、最終的に私は(同僚の助けを借りて)解決策に出くわしました。

  • @Propertyアノテーションを使用する代わりに、@Embeddedを使用します。と
  • マップインターフェイスを使用せずに、具体的なHashMapを使用してマップを宣言します

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

以前のすべての推奨事項は機能しませんでした。モルヒネがデータを適切に読み取るようにする唯一のことは、OwnDataTypeを複数形に変換することでした。つまり、OwnDataType自体の内部にマップを保持し、マップ内のマップを使用しません。

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

これで、すべてが正常に機能しています。

于 2015-06-10T11:15:52.643 に答える