Можно ли создать общий репозиторий, расширяющий другие интерфейсы, расширяющие CrudRepository Spring? - PullRequest
0 голосов
/ 25 апреля 2019

Вот подробности:

У меня есть несколько моделей в моем приложении, каждая модель имеет хранилище, расширяющее CrudRepository.

Spring. Например:

  • EyeColorModel имеет хранилище interface EyeColorRepository extends CrudRepository<EyeColor, Long>

  • HairColorModel имеет хранилище interface HairColorRepository extends CrudRepository<HairColor, Long>

  • StateModel имеет хранилищеinterface StateRepository extends CrudRepository<State, Long>

  • и так далее ...

Я хотел бы создать универсальный MyApplicationRepository, который расширяет все мои отдельные репозиториитак что мне нужно создать только один экземпляр MyApplicationRepository вместо создания нескольких экземпляров моих отдельных репозиториев.

Я попробовал это:

public interface MyApplicationRepositoryInterface extends
    EyeColorRepository,
    HairColorRepository,
    StateRepository {
}


public class MyApplicationRepository implements MyApplicationRepositoryInterface {
}

Однако, когда я пытаюсь расширить всеиз моих отдельных репозиториев в MyApplicationRepositoryInterface я получаю эту ошибку:

CrudRepository cannot be inherited with different arguments: <com.myapp.Models.EyeColor, java.lang.Long> and <com.myapp.Models.HairColor, java.lang.Long>

Так есть ли способ сделать то, что я хотел бы сделать, или я застрял с экземплярами всех моих репозиториев моделей?

Ответы [ 2 ]

2 голосов
/ 25 апреля 2019

Сначала я попытаюсь объяснить возникшую ошибку: CrudRepository является параметризованным интерфейсом, а наследование от (нескольких) CrudRepository интерфейсов различных параметризованных типов создает конфликт во время выполнения.

ИМО, то, что вы пытаетесь сделать, контрпродуктивно. Хранилище данных Spring обеспечивает безопасную для типов реализацию методов CRUD во время выполнения, когда вы расширяете CrudRepository. Это дает вам более чистый код и обеспечивает корректность во время компиляции. И, CrudRepository уже довольно общий характер - так лучше (на уровне интерфейса, чем в реализации).

Даже если бы вы создали такой репозиторий, вам пришлось бы отказаться от использования CrudRepository и создать один класс со всеми методами CRUD для всех ваших моделей (например, saveEyeColor, saveHairColor и т. Д.). Может быть, использовать что-то вроде SpringTemplate. Это не лучший способ сделать это, IMO, так как вы будете смешивать свои доменные объекты, и класс станет кошмаром для обслуживания.

Чтобы ответить на ваш вопрос, да, вам придется внедрить отдельный экземпляр репозитория для каждой модели.

0 голосов
/ 25 апреля 2019

Это неправильный подход.CrudRepositories не должен быть реализован.Вы просто создаете интерфейсы репозитория для всех моделей, расширяя интерфейс CrudRepository.Spring предоставляет реализацию во время выполнения.

Если вы хотите получить к ним доступ через один класс, то создайте класс Service с методами, которые обращаются к необходимым методам в этих отдельных репозиториях.

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