SpringData Mongodb MongoTemplate.findAndModify没有设置" _class"嵌入对象的值

时间:2012-10-16 06:26:26

标签: mongodb spring-data

我正在使用Spring Data Commons - 1.4.0.RC1和Spring Data MongoDB - 1.1.0.RC1,使用mongoTemplate.findAndModify()更新嵌入文档列表(具有相同类层次结构)时出现问题,它没有像mongoTemplate.save()那样设置“_class”值,从mongodb读取数据时会导致问题,因为应用程序不知道要为该列表中的每个嵌入式doc实例化哪个具体类。

例如,我有一个学生班,一个学生已经注册了数学,物理,计算机科学等科目。这不是我正在使用的领域,但应该足以证明这个问题。所以我将一个Student类映射到一个“student”集合,一个主题列表作为嵌入文档,所有主题都扩展了Subject超类,如下所示:

@Document
public class Student {

@Id
private String identifier;

private List<Subject> subjcts;
}  

public abstract class Subject {
// common properties and methods;
}

public class Maths  extends Subject {}

public class Physics extends Subject{}

要创建学生并保存到数据库,我

Student student = new Student();
student.setIdentifier(UUID.random().toString);
student.addSubject(new Maths());
student.addSubject(new Physics());

mongoTemplate.insert(student); or mongoTemplate.save(student);

上面将创建一个学生,主题数学和物理作为嵌入文档,并带有一个额外的字段“_class”,指定具体类,以便在从db中获取时可以将其映射到正确的类。

但是,如果现在我想要更新主题列表,可以直观地执行mongoTemplate.findAndModify(the query, new Update().set("subject", newSubjects), Student.class);

之类的操作

但是findAndModify似乎没有通过为主题设置“_class”的类型映射器,因此导致从db读回的问题。

这是Spring Data中的错误吗?我该如何解决?

任何指针都将受到赞赏。 谢谢。

1 个答案:

答案 0 :(得分:3)

这是SpringData MongoDB(https://jira.springsource.org/browse/DATAMONGO-392)的已知问题。

目前我发现的唯一解决方法是为内部文档类创建一个特定的转换器。