首页 > 解决方案 > 在spring Data中使用继承时如何检索对象

问题描述

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

Manager extends Person {
  private String name;

 Manager() {

 }
}

Clerk extends Person {
  private String salary;
}

在 Spring Data 中,如果我将这些存储在 Mongo 中,是否可以在执行 getById 时将其配置为映射正确的类。我想我将不得不存储一些课程信息?

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

标签: springspring-data-jpa

解决方案


如果您使用 spring-data-mongodb MongoRepository 根据您的实体模型在数据库中写入数据,_class则会将一个字段添加到文档根和复杂的属性类型(请参阅本节)。此字段存储 Java 类的完全限定名称,并且在从 MongoDb 文档映射到 Spring 数据模型时允许消除歧义。

但是,如果您只使用MongoRepository从数据库中读取数据,则需要告诉 Spring-data 如何显式映射您的实体。您将需要使用 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;
        }
    }
}

然后,您必须使用 MongoConverter 注册 Spring 转换器

您可以在以下位置找到我自己的示例:Spring Data Mongo - 如何映射继承的 POJO 实体?


推荐阅读