我正在使用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中的错误吗?我该如何解决?
任何指针都将受到赞赏。 谢谢。
答案 0 :(得分:3)
这是SpringData MongoDB(https://jira.springsource.org/browse/DATAMONGO-392)的已知问题。
目前我发现的唯一解决方法是为内部文档类创建一个特定的转换器。