package org.mongodb.morphia.mapping; import org.bson.types.ObjectId; import org.junit.Test; import org.mongodb.morphia.TestBase; import org.mongodb.morphia.annotations.Id; import org.mongodb.morphia.query.Query; import org.mongodb.morphia.query.UpdateOperations; import java.util.HashMap; import java.util.Map; public class UpdateRetainsClassInfoTest extends TestBase { @Test public void retainsClassName() { final X x = new X(); final E1 e1 = new E1(); e1.foo = "narf"; x.map.put("k1", e1); final E2 e2 = new E2(); e2.bar = "narf"; x.map.put("k2", e2); getDs().save(x); final Query<X> query = getDs().find(X.class); final UpdateOperations<X> update = getDs().createUpdateOperations(X.class); update.set("map.k2", e2); getDs().update(query, update); // fails due to type now missing getDs().find(X.class).get(); } public abstract static class E { @Id private ObjectId id = new ObjectId(); } public static class E1 extends E { private String foo; } public static class E2 extends E { private String bar; } public static class X { private final Map<String, E> map = new HashMap<String, E>(); @Id private ObjectId id; } }