Morphia betrachtet Map als eine DB-Referenz zu einem anderen Dokument, anstatt es als eingebettete Klasse zu sehen und als Dokument zu behandeln. Die Lösung wäre, die Map mit @Embedded zu kommentieren, aber das ist nicht möglich, da Sie die Map-Klasse nicht bearbeiten können.
Es gibt eine Möglichkeit, etwas Ähnliches wie das zu erreichen, was Sie versuchen, indem Sie eine andere Klasse erstellen und die Map als Eigenschaft dieser Klasse definieren und sie als @Embedded.
kommentierenÄndern Sie die Temp-Klasse:
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();
}
}
und erstellen Sie eine neue Klasse:
@Embedded
public class MapProxy {
public Map<String,Object> m = new HashMap<String, Object>();
}
Ich habe die von mir vorgenommenen Änderungen markiert.
Die Struktur, die dies erzeugt, sieht folgendermaßen aus:
{
"_id" : "hi",
"className" : "YOUR CLASS NAME HERE",
"strings" :
[ {
"m" :
{
"Hi" : "1" ,
"Hi2" : 2
}
} ]
}