Универсальный репозиторий весной JPA - PullRequest
0 голосов
/ 25 июня 2018

Мы работаем над проектом Restful с большим количеством таблиц БД.Хотя операции над таблицами почти одинаковы и, в основном, INSERT / UPDATE / DELETE / FETCH.

мои вопросы:
нам нужно будет создать репозиторий (расширяющий JpaRepository) для каждой сущности (класса домена)мы создаем или есть вариант создания GenericRepository, который может обрабатывать все вышеупомянутые функции для всех объектов?т. е. один GenericRepository для всех.

если так, не могли бы вы поделиться примером?

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

есть [есть] возможность создания GenericRepository, который может обрабатывать все вышеупомянутые функции для всех объектов?

Вы смотрите на это с неверным предположениемУ вас действительно не должно быть хранилища для каждой таблицы / сущности, а для совокупности (корень).См. Предполагается, что у вас есть один репозиторий на таблицу в JPA? для получения дополнительной информации.

Второе: наличие общего типа репозитория не соответствует цели Spring Data JPA, в конце концов, JPA ужеимеет общий репозиторий.Это называется EntityManager.Так что если вам нужны только те операции, которые вы упомянули, просто введите 1011 *.Нет необходимости использовать Spring Data JPA вообще.И если вы хотите иметь что-то между вашим бизнес-кодом и спецификациями JPA, вы можете обернуть это в простой репозиторий, как описано в @AlexSalauyou.

И последний момент: у вас будеткод для создания всех таблиц где-то.У вас также будет код для всех сущностей.И у вас есть код для тестирования этого.Является ли наличие тривиального определения интерфейса для каждого из них проблемой?

0 голосов
/ 25 июня 2018

Для операций вставки / обновления / удаления такой репозиторий может быть простым:

@Component
public class CommonRepository {

  @PersistenceContext
  EntityManager em;

  @Transactional
  public <E> E insert(E entity) {
     em.persist(entity);
     return entity;
  }

  @Transactional
  public <E> E update(E entity) {
     return em.merge(entity);
  }

  @Transactional
  public void delete(Object entity) {
     em.remove(entity);
  }

}

Для более точного кода см. SimpleJpaRepository реализация

...