说我有一个如下的类结构,它是非常基本的继承:
Manager extends Person {
private String name;
Manager() {
}
}
Clerk extends Person {
private String salary;
}
在Spring Data中,如果我将它们存储在Mongo中,可以在执行getById时将其配置为映射正确的类。我想我必须存储一些班级信息?
我不想做的是,如果可以避免的话,需要创建单独的存储库类,而且我不知道在执行getById时对象将是什么
答案 0 :(得分:1)
如果您正在使用spring-data-mongodb MongoRepository根据您的实体模型在数据库中写入数据,则_class
字段将添加到文档根目录和复杂的属性类型(请参阅本节)。该字段存储Java类的完全限定名称,在从MongoDb文档映射到Spring数据模型时,它可以消除歧义。
但是,如果仅使用MongoRepository来读取数据库,则需要告诉Spring-data如何显式映射实体。您需要Override Mapping with Explicit Converters。
PersonReadConverter.class
public class PersonReadConverter implements Converter<Document, Person> {
@Override
public Contact convert(Document source) {
if (source.get("attribute_specific_to_Clerk") != null) {
Clerk clerk = new Clerk();
//Set attributes using setters or defined constructor
return clerk;
}
else {
Manager manager = new Manager()
//Set attribute using setters or defined constructor
return manager;
}
}
}
然后,您必须Register Spring Converters with the MongoConverter。
您可以在以下网址找到我自己的示例:Spring Data Mongo - How to map inherited POJO entities?