Как нам создать общий репозиторий в Spring Data JPA? - PullRequest
0 голосов
/ 16 марта 2019

Я создал интерфейс для конкретного хранилища, например:

@Repository
public interface PlayerRepository extends CrudRepository<Player, Long> {
}

Есть ли способ создать общий репозиторий, чтобы мне не нужно было создавать объект репозитория для POJO, что-то в этом роде:

@Repository
public interface PlayerRepository<T> extends CrudRepository<T, Long> {
}

1 Ответ

1 голос
/ 16 марта 2019

Боюсь, что нет. Если бы вы уже попробовали, вы бы заметили, что ваш второй репозиторий extending CrudRepository<T, Long> не работает с чем-то вроде:

Ошибка вызова метода init; вложенным исключением является java.lang.IllegalArgumentException: не управляемый тип: класс java.lang.Object.

потому что с помощью общего T java может только сказать, что это Object, который не является сущностью. И из-за этого вам нужно добавить аннотацию @NoRepositoryBean, которая затем позволяет расширять ее только реальным типом сущности вместо общего T.

Это может быть возможно программно, но, скорее всего, будет гораздо сложнее, чем просто создавать интерфейсы репо.

Если у вас есть дерево наследования сущностей, такое как A->B->C, вы можете создать репо для A, который затем обрабатывает также B & C, что относится к свойствам, унаследованным от A. Таким образом, вы можете выдать findAll(), и он вернет вам все A s, B s & C s, но в виде списка A s, и вам придется проверять фактический тип каждого элемента отдельно.

Обычно, когда нет необходимости в каком-либо особом подходе к сущностям, и вы не хотите писать эти заглушки репозитория, вы можете просто использовать EntityManager напрямую. Вы можете реализовать свой собственный - общий репозиторий, например - @Service класс, который имеет @Autowired менеджер сущностей и вызывать его find(..), persist(..) и другие методы.

...