У чому різниця між CrudRepository і JpaRepository інтерфейсів в Spring Data JPA ?
Коли я бачу приклади в Інтернеті, я бачу, що вони там використовуються як взаємозамінні.
У чому різниця між ними?
Чому ви хочете використовувати один над іншим?
У чому різниця між CrudRepository і JpaRepository інтерфейсів в Spring Data JPA ?
Коли я бачу приклади в Інтернеті, я бачу, що вони там використовуються як взаємозамінні.
У чому різниця між ними?
Чому ви хочете використовувати один над іншим?
Відповіді:
JpaRepository
розширюється, PagingAndSortingRepository
що в свою чергу поширюється CrudRepository
.
Основними їх функціями є:
CrudRepository
в основному надає функції CRUD.PagingAndSortingRepository
надає методи робити записи на сторінки та сортування.JpaRepository
надає деякі методи, пов'язані з JPA, такі як промивання контенту стійкості та видалення записів у партії.Через вищезазначене спадщину JpaRepository
будуть виконувати всі функції CrudRepository
і PagingAndSortingRepository
. Тож якщо вам не потрібен сховище, щоб мати функції, надані JpaRepository
та PagingAndSortingRepository
використовуйте CrudRepository
.
Відповідь Кена в основному правильна, але я хотів би задзвонити на "чому б ви хотіли використовувати один над іншим?" частина вашого запитання.
Базовий інтерфейс, який ви обираєте для свого сховища, має дві основні цілі. По-перше, ви дозволяєте інфраструктурі сховища Spring Data знаходити свій інтерфейс і запускати створення проксі, щоб ви вводили екземпляри інтерфейсу клієнтам. Друга мета - залучити в інтерфейс стільки функціональних можливостей, скільки не потрібно оголошувати зайві методи.
Основна бібліотека Spring Data постачається з двома базовими інтерфейсами, які розкривають виділений набір функціональних можливостей:
CrudRepository
- методи CRUDPagingAndSortingRepository
- методи пагинації та сортування (розширення CrudRepository
)Окремі модулі магазину (наприклад, для JPA або MongoDB) розкривають специфічні для магазину розширення цих базових інтерфейсів, щоб забезпечити доступ до специфічних для зберігання функцій, таких як промивання або виділене дозування, що враховують деякі особливості магазину. Прикладом цього є те, deleteInBatch(…)
з JpaRepository
якого відрізняється від , delete(…)
як він використовує запит , щоб видалити дані об'єкти , які є більш продуктивним , але приходить з побічним ефектом , не викликаючи JPA певних каскадів (як специфікація визначає його).
Ми, як правило, рекомендуємо не використовувати ці базові інтерфейси, оскільки вони піддають клієнтам основні технології збереження і тим самим посилюють зв'язок між ними та сховищем. Крім того, ви трохи відходите від початкового визначення сховища, яке в основному є "сукупністю об'єктів". Тож, якщо зможете, залишайтеся PagingAndSortingRepository
.
Мінус прямого залежно від одного із наданих базових інтерфейсів є дворазовим. І те й інше можна вважати теоретичним, але я думаю, що їх важливо знати:
Page
або Pageable
у своєму коді. Spring Data не відрізняється від будь-якої іншої бібліотеки загального призначення, наприклад, commons-lang або Guava. Поки це дає розумну користь, це просто чудово.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
але не піддавати маніпулюють з них. Детальніше про цей підхід читайте в довідковій документації .
Абстракція сховища дозволяє вибрати базовий сховище, повністю кероване вашими архітектурними та функціональними потребами. Використовуйте подані з коробки, якщо вони підходять, створіть власні базові інтерфейси сховища, якщо це необхідно. Залишайтеся подалі від інтерфейсів сховища, якщо це не можливо.
Підсумок:
PagingAndSortingRepository розширює CrudRepository
JpaRepository розширює сховище PagingAndSortingRepository
Інтерфейс CrudRepository надає методи для операцій CRUD, тому він дозволяє створювати, читати, оновлювати та видаляти записи без необхідності визначення власних методів.
PagingAndSortingRepository надає додаткові методи для вилучення об'єктів з допомогою розбиття на сторінки і сортування.
Нарешті, JpaRepository додасть ще кілька функціональних можливостей, характерних для JPA.
Усі відповіді дають достатньо детальних запитань. Однак дозвольте додати щось більше.
Для чого ми використовуємо ці інтерфейси:
Який інтерфейс робить що:
Коли користуватися інтерфейсом:
Відповідно до http://jtuts.com/2014/08/26/difference-between-crudrepository-and-jparepository-in-spring-data-jpa/
Як правило, найкраща ідея - використовувати CrudRepository або PagingAndSortingRepository, залежно від того, потрібні вам сортування та підказка чи ні.
JpaRepository слід уникати , якщо це можливо, тому що вона пов'язує вас репозиторії з технологією JPA наполегливості, і в більшості випадків ви , ймовірно , не будете навіть використовувати додаткові методи , що надаються їм.