1

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

例如,我有一个学生班,一个学生注册了数学、物理、计算机科学等科目。这不是我正在研究的领域,但应该足以证明问题。因此,我将一个 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”,指定具体类,以便在从数据库中获取时可以将其映射到正确的类。

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

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

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

任何指针将不胜感激。谢谢你。

4

1 回答 1

3

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

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

于 2012-10-16T06:35:30.747 回答