Morphiaは、Mapを埋め込みクラスと見なしてドキュメントとして扱うのではなく、別のドキュメントへのDB参照と見なします。解決策は、Map @Embeddedに注釈を付けることですが、Mapクラスを編集できないため、これは不可能です。
別のクラスを作成し、Mapをこのクラスのプロパティとして定義し、@ Embeddedとしてアノテーションを付けることで、試みているものと同様のことを実現する方法があります。
Tempクラスを変更します:
public class Temp {
@Id String _id;
@Embedded // CHANGE HERE
List<MapProxy> strings; // CHANGE HERE
public Temp(){
strings=new LinkedList<MapProxy>(); // CHANGE HERE
}
public static void main(String...args) throws UnknownHostException, MongoException{
Mongo mongo=null;
Morphia morphia=null;
Datastore ds=null;
mongo = new Mongo();
morphia = new Morphia();
morphia.map(Temp.class);
ds = morphia.createDatastore(mongo, "test2");
Temp t = new Temp();
t._id ="hi";
MapProxy mp = new MapProxy(); // CHANGE HERE
mp.m.put("Hi","1"); // CHANGE HERE
mp.m.put("Hi2",2); // CHANGE HERE
t.strings.add(mp); // CHANGE HERE
ds.save(t);
t=ds.get(t);
ds.ensureIndexes();
}
}
新しいクラスを作成します:
@Embedded
public class MapProxy {
public Map<String,Object> m = new HashMap<String, Object>();
}
行った変更にマークを付けました。
これが生成する構造は次のようになります:
{
"_id" : "hi",
"className" : "YOUR CLASS NAME HERE",
"strings" :
[ {
"m" :
{
"Hi" : "1" ,
"Hi2" : 2
}
} ]
}