Яка різниця між інтерфейсами CrudRepository та JpaRepository у Spring Data JPA?


705

У чому різниця між CrudRepository і JpaRepository інтерфейсів в Spring Data JPA ?

Коли я бачу приклади в Інтернеті, я бачу, що вони там використовуються як взаємозамінні.

У чому різниця між ними?

Чому ви хочете використовувати один над іншим?


Читайте також розділ цієї статті Вступ до весняних сховищ даних
Lucky

Відповіді:


954

JpaRepositoryрозширюється, PagingAndSortingRepositoryщо в свою чергу поширюється CrudRepository.

Основними їх функціями є:

  • CrudRepository в основному надає функції CRUD.
  • PagingAndSortingRepository надає методи робити записи на сторінки та сортування.
  • JpaRepository надає деякі методи, пов'язані з JPA, такі як промивання контенту стійкості та видалення записів у партії.

Через вищезазначене спадщину JpaRepositoryбудуть виконувати всі функції CrudRepositoryі PagingAndSortingRepository. Тож якщо вам не потрібен сховище, щоб мати функції, надані JpaRepositoryта PagingAndSortingRepositoryвикористовуйте CrudRepository.


142
і повертає Список <> замість Iterable <> in findAll () :-)
Hinotori

397

Відповідь Кена в основному правильна, але я хотів би задзвонити на "чому б ви хотіли використовувати один над іншим?" частина вашого запитання.

Основи

Базовий інтерфейс, який ви обираєте для свого сховища, має дві основні цілі. По-перше, ви дозволяєте інфраструктурі сховища Spring Data знаходити свій інтерфейс і запускати створення проксі, щоб ви вводили екземпляри інтерфейсу клієнтам. Друга мета - залучити в інтерфейс стільки функціональних можливостей, скільки не потрібно оголошувати зайві методи.

Загальні інтерфейси

Основна бібліотека Spring Data постачається з двома базовими інтерфейсами, які розкривають виділений набір функціональних можливостей:

  • CrudRepository - методи CRUD
  • PagingAndSortingRepository- методи пагинації та сортування (розширення CrudRepository)

Інтерфейси, характерні для магазину

Окремі модулі магазину (наприклад, для JPA або MongoDB) розкривають специфічні для магазину розширення цих базових інтерфейсів, щоб забезпечити доступ до специфічних для зберігання функцій, таких як промивання або виділене дозування, що враховують деякі особливості магазину. Прикладом цього є те, deleteInBatch(…)з JpaRepositoryякого відрізняється від , delete(…)як він використовує запит , щоб видалити дані об'єкти , які є більш продуктивним , але приходить з побічним ефектом , не викликаючи JPA певних каскадів (як специфікація визначає його).

Ми, як правило, рекомендуємо не використовувати ці базові інтерфейси, оскільки вони піддають клієнтам основні технології збереження і тим самим посилюють зв'язок між ними та сховищем. Крім того, ви трохи відходите від початкового визначення сховища, яке в основному є "сукупністю об'єктів". Тож, якщо зможете, залишайтеся PagingAndSortingRepository.

Базові інтерфейси сховища

Мінус прямого залежно від одного із наданих базових інтерфейсів є дворазовим. І те й інше можна вважати теоретичним, але я думаю, що їх важливо знати:

  1. Залежно від інтерфейсу сховища Spring Data з'єднує ваш інтерфейс сховища до бібліотеки. Я не думаю, що це особлива проблема, оскільки ви, ймовірно, будете використовувати абстракції, як-небудь Pageабо Pageableу своєму коді. Spring Data не відрізняється від будь-якої іншої бібліотеки загального призначення, наприклад, commons-lang або Guava. Поки це дає розумну користь, це просто чудово.
  2. Розширюючи, наприклад CrudRepository, ви виявляєте одразу повний набір методів стійкості. Це, мабуть, добре і в більшості обставин, але ви можете зіткнутися з ситуаціями, коли ви хочете отримати більш дрібний контроль над викритими методами, наприклад, створити такий ReadOnlyRepository, який не включає save(…)та delete(…)методи CrudRepository.

Рішення обох цих недоліків - створити власний інтерфейс базового сховища або навіть їх набір. У багатьох програмах я бачив щось подібне:

interface ApplicationRepository<T> extends PagingAndSortingRepository<T, Long> { }

interface ReadOnlyRepository<T> extends Repository<T, Long> {

  // Al finder methods go here
}

Перший інтерфейс сховища - це базовий інтерфейс загального призначення, який фактично фіксує лише точку 1, але також прив'язує тип ідентифікації Longдля узгодженості. Другий інтерфейс , як правило , має всі find…(…)методи , скопійовані з CrudRepositoryі , PagingAndSortingRepositoryале не піддавати маніпулюють з них. Детальніше про цей підхід читайте в довідковій документації .

Резюме - тл; д-р

Абстракція сховища дозволяє вибрати базовий сховище, повністю кероване вашими архітектурними та функціональними потребами. Використовуйте подані з коробки, якщо вони підходять, створіть власні базові інтерфейси сховища, якщо це необхідно. Залишайтеся подалі від інтерфейсів сховища, якщо це не можливо.


84

введіть тут опис зображення

Підсумок:

  • PagingAndSortingRepository розширює CrudRepository

  • JpaRepository розширює сховище PagingAndSortingRepository

Інтерфейс CrudRepository надає методи для операцій CRUD, тому він дозволяє створювати, читати, оновлювати та видаляти записи без необхідності визначення власних методів.

PagingAndSortingRepository надає додаткові методи для вилучення об'єктів з допомогою розбиття на сторінки і сортування.

Нарешті, JpaRepository додасть ще кілька функціональних можливостей, характерних для JPA.


А як щодо "розширює сховище <>"? Які методи він буде мати? Те саме, що і CrudRepository?
s-kaczmarek


3

Усі відповіді дають достатньо детальних запитань. Однак дозвольте додати щось більше.

Для чого ми використовуємо ці інтерфейси:

  • Вони дозволяють Spring знайти інтерфейси вашого сховища та створити для них проксі-об'єкти.
  • Він надає вам методи, які дозволяють виконувати деякі звичайні операції (ви також можете визначити свій власний метод). Мені подобається ця функція, тому що створення методу (а також визначення запиту та підготовлених операторів, а потім виконання запиту з об’єктом з'єднання) зробити просту операцію справді відстійно!

Який інтерфейс робить що:

  • CrudRepository : надає функції CRUD
  • PagingAndSortingRepository : надає методи для створення сторінок і сортування записів
  • JpaRepository : надає пов'язані з JPA методи, такі як промивання контенту стійкості та видалення записів у пакеті

Коли користуватися інтерфейсом:

Відповідно до http://jtuts.com/2014/08/26/difference-between-crudrepository-and-jparepository-in-spring-data-jpa/

Як правило, найкраща ідея - використовувати CrudRepository або PagingAndSortingRepository, залежно від того, потрібні вам сортування та підказка чи ні.

JpaRepository слід уникати , якщо це можливо, тому що вона пов'язує вас репозиторії з технологією JPA наполегливості, і в більшості випадків ви , ймовірно , не будете навіть використовувати додаткові методи , що надаються їм.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.