Morphia coi Bản đồ như một tham chiếu DB đến một tài liệu khác chứ không phải coi nó như một lớp nhúng và coi nó như một tài liệu. Giải pháp là chú thích Bản đồ @Embedded, nhưng điều này không thể thực hiện được vì bạn không thể chỉnh sửa lớp Bản đồ.
Có một cách để đạt được điều gì đó tương tự như những gì bạn đang cố gắng bằng cách tạo một lớp khác và xác định Bản đồ là thuộc tính của lớp này và chú thích nó là @Embedded.
Thay đổi lớp 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();
}
}
và tạo một lớp mới:
@Embedded
public class MapProxy {
public Map<String,Object> m = new HashMap<String, Object>();
}
Tôi đã đánh dấu những thay đổi mà tôi đã thực hiện.
Cấu trúc mà nó tạo ra là như thế này:
{
"_id" : "hi",
"className" : "YOUR CLASS NAME HERE",
"strings" :
[ {
"m" :
{
"Hi" : "1" ,
"Hi2" : 2
}
} ]
}