Рубрики
Без рубрики

CrudRepository, JpaRepository и PagingAndSortingRepository в весенних данных

Узнайте о различных вариантах хранилищ, предлагаемых Spring Data.

Автор оригинала: 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. Грубая репозиция

3. Грубая репозиция

public interface CrudRepository
  extends Repository {

     S save(S entity);

    T findOne(ID primaryKey);

    Iterable findAll();

    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 PagingAndSortingRepository 
  extends CrudRepository {

    Iterable findAll(Sort sort);

    Page findAll(Pageable pageable);
}

Этот интерфейс предоставляет метод findAll(Pageable pageable) , который является ключом к реализации разбиения на страницы.

При использовании Pageable мы создаем Pageable объект с определенными свойствами , и мы должны указать, по крайней мере,:

  1. Размер страницы
  2. Номер текущей страницы
  3. Сортировка

Итак, предположим, что мы хотим показать первую страницу результирующего набора, отсортированного по фамилии, возрастанию, содержащего не более пяти записей в каждой. Вот как мы можем достичь этого, используя запрос страницы и определение Сортировки :

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 JpaRepository extends
  PagingAndSortingRepository {

    List findAll();

    List findAll(Sort sort);

    List save(Iterable 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

Помимо всех очень полезных преимуществ этих репозиториев, есть некоторые основные недостатки прямой зависимости от них:

  1. мы связываем наш код с библиотекой и ее конкретными абстракциями, такими как “Страница” или “Страница”; это, конечно, не уникально для этой библиотеки, но мы должны быть осторожны, чтобы не раскрывать эти внутренние детали реализации
  2. расширяя, например, CrudRepository , мы сразу раскрываем полный набор методов сохранения. Это, вероятно, хорошо и в большинстве случаев, но мы можем столкнуться с ситуациями, когда мы хотели бы получить более точный контроль над доступными методами, например, создать ReadOnlyRepository , который не включает save(…) и delete(…) методы CrudRepository

7. Заключение

В этой статье были рассмотрены некоторые краткие, но важные различия и особенности интерфейсов репозитория Spring Data JPA.

Для получения дополнительной информации ознакомьтесь с серией о постоянстве весны .