Автор оригинала: Shubham Aggarwal.
1. Обзор
В этой краткой статье мы сосредоточимся на различных типах интерфейсов хранилища данных Spring и их функциональности. Мы коснемся этого вопроса:
- CrudRepository
- PagingAndSortingRepository
- JpaRepository
Проще говоря, каждый репозиторий в Spring Data расширяет общий интерфейс Repository , но помимо этого у каждого из них есть разные функции.
2. Весенние хранилища данных
Давайте начнем с JpaRepository – который расширяет PagingAndSortingRepository и, в свою очередь, CrudRepository .
Каждый из них определяет свою собственную функциональность:
- CrudRepository предоставляет функции CRUD
- PagingAndSortingRepository предоставляет методы для разбиения на страницы и сортировки записей
- JpaRepository предоставляет связанные с JPA методы, такие как очистка контекста сохранения и удаление записей в пакете
Таким образом, из-за этого отношения наследования JpaRepository содержит полный API CrudRepository и PagingAndSortingRepository .
Когда нам не нужна полная функциональность , предоставляемая JpaRepository и PagingAndSortingRepository , мы можем просто использовать CrudRepository .
Давайте теперь рассмотрим краткий пример, чтобы лучше понять эти API.
Мы начнем с простого Продукта сущности:
@Entity public class Product { @Id private long id; private String name; // getters and setters }
И давайте осуществим простую операцию – найдем Продукт по его названию:
@Repository public interface ProductRepository extends JpaRepository{ Product findByName(String productName); }
Это все. Хранилище данных Spring автоматически сгенерирует реализацию на основе имени, которое мы ей предоставили.
Конечно, это был очень простой пример; вы можете углубиться в Spring Data JPA здесь .
3. Грубая репозиция
public interface CrudRepositoryextends Repository { S save(S entity); T findOne(ID primaryKey); IterablefindAll(); Long count(); void delete(T entity); boolean exists(ID primaryKey); }
Обратите внимание на типичную функциональность CRUD:
- save(…) – s ave an Iterable сущностей. Здесь мы можем передать несколько объектов, чтобы сохранить их в пакете
- findOne(…) – получение одной сущности на основе переданного значения первичного ключа
- findAll() – получить Итерируемый всех доступных сущностей в базе данных
- count() – r eturn количество общих сущностей в таблице
- удалить(…) – удалить объект на основе переданного объекта
- существует(…) – проверьте, существует ли сущность на основе переданного значения первичного ключа
Этот интерфейс выглядит довольно общим и простым, но на самом деле он предоставляет все основные абстракции запросов, необходимые в приложении.
4. PagingAndSortingRepository
Теперь давайте посмотрим на другой интерфейс репозитория, который расширяет CrudRepository :
public interface PagingAndSortingRepositoryextends CrudRepository { Iterable findAll(Sort sort); Page findAll(Pageable pageable); }
Этот интерфейс предоставляет метод findAll(Pageable pageable) , который является ключом к реализации разбиения на страницы.
При использовании Pageable мы создаем Pageable объект с определенными свойствами , и мы должны указать, по крайней мере,:
- Размер страницы
- Номер текущей страницы
- Сортировка
Итак, предположим, что мы хотим показать первую страницу результирующего набора, отсортированного по фамилии, возрастанию, содержащего не более пяти записей в каждой. Вот как мы можем достичь этого, используя запрос страницы и определение Сортировки :
Sort sort = new Sort(new Sort.Order(Direction.ASC, "lastName")); Pageable pageable = new PageRequest(0, 5, sort);
Передача объекта pageable в запрос данных Spring вернет соответствующие результаты (первый параметр PageRequest основан на нуле).
5. JpaRepository
Наконец, мы рассмотрим интерфейс JpaRepository :
public interface JpaRepositoryextends PagingAndSortingRepository { List findAll(); List findAll(Sort sort); List save(Iterable extends T> entities); void flush(); T saveAndFlush(T entity); void deleteInBatch(Iterable entities); }
Опять же, давайте вкратце рассмотрим каждый из этих методов:
- findAll() – получить Список всех доступных сущностей в базе данных
- findAll(…) – получить Список всех доступных сущностей и отсортировать их с помощью предоставленного условия
- save(…) – s ave an Iterable сущностей. Здесь мы можем передать несколько объектов, чтобы сохранить их в пакете
- flush() – f добавить все отложенные задачи в базу данных
- saveAndFlush(…) – сохраните объект и немедленно сбросьте изменения
- deleteInBatch(…) – удаление итеративного объекта. Здесь мы можем передать несколько объектов, чтобы удалить их в пакете
Очевидно, что приведенный выше интерфейс расширяет PagingAndSortingRepository , что означает, что он также имеет все методы, присутствующие в CrudRepository .
6. Недостатки хранилищ данных Spring
Помимо всех очень полезных преимуществ этих репозиториев, есть некоторые основные недостатки прямой зависимости от них:
- мы связываем наш код с библиотекой и ее конкретными абстракциями, такими как “Страница” или “Страница”; это, конечно, не уникально для этой библиотеки, но мы должны быть осторожны, чтобы не раскрывать эти внутренние детали реализации
- расширяя, например, CrudRepository , мы сразу раскрываем полный набор методов сохранения. Это, вероятно, хорошо и в большинстве случаев, но мы можем столкнуться с ситуациями, когда мы хотели бы получить более точный контроль над доступными методами, например, создать ReadOnlyRepository , который не включает save(…) и delete(…) методы CrudRepository
7. Заключение
В этой статье были рассмотрены некоторые краткие, но важные различия и особенности интерфейсов репозитория Spring Data JPA.
Для получения дополнительной информации ознакомьтесь с серией о постоянстве весны .