在Spring Data中使用继承时如何检索对象

时间:2019-02-08 11:41:26

标签: spring spring-data-jpa

说我有一个如下的类结构,它是非常基本的继承:

Manager extends Person {
  private String name;

 Manager() {

 }
}

Clerk extends Person {
  private String salary;
}

在Spring Data中,如果我将它们存储在Mongo中,可以在执行getById时将其配置为映射正确的类。我想我必须存储一些班级信息?

我不想做的是,如果可以避免的话,需要创建单独的存储库类,而且我不知道在执行getById时对象将是什么

1 个答案:

答案 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?