Как получить объекты при использовании наследования в весной Data - PullRequest
0 голосов
/ 08 февраля 2019

Скажем, у меня есть структура классов следующим образом, это довольно простое наследование:

Manager extends Person {
  private String name;

 Manager() {

 }
}

Clerk extends Person {
  private String salary;
}

Весной Данные, если я храню их в Монго, можно ли настроить их так, чтобы они отображали правильный класс, когда ясделать getById.Я предполагаю, что мне придется хранить некоторую информацию о классе?

Что я не хочу делать, так это необходимость создавать отдельные классы репозитория, если я могу этого избежать, также я не знаю, каким будет объект, когда я сделаюGetByID

1 Ответ

0 голосов
/ 11 февраля 2019

Если вы используете spring-data-mongodb MongoRepository для записи данных в вашу базу данных в соответствии с вашей моделью сущностей, поле _class будет добавлено к корням документов и к сложным типам свойств (см. Этот раздел).В этих полях хранится полное имя класса Java, и это позволяет устранить неоднозначность при отображении из документа MongoDb в модель данных Spring.

Однако, если вы используете только MongoRepository для чтения из вашей базы данных, вам нужно указать Spring-data, как явно сопоставить ваши сущности.Вам потребуется Переопределить сопоставление с явными конвертерами .

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;
        }
    }
}

Затем необходимо Зарегистрировать SpringКонвертеры с MongoConverter .

Мой собственный пример можно найти по адресу: Spring Data Mongo - Как отобразить унаследованные объекты POJO?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...