В чем разница между интерфейсами CrudRepository и JpaRepository в Spring Data JPA?
В чем разница между CrudRepository
а также JpaRepository
интерфейсы в Spring Data JPA?
Когда я вижу примеры в Интернете, я вижу, что они используются взаимозаменяемо. В чем разница между ними? Почему вы хотите использовать один поверх другого?
10 ответов
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
,
Пользовательские интерфейсы репозитория
Недостаток прямой зависимости от одного из предоставленных базовых интерфейсов - двоякий. Оба они могут рассматриваться как теоретические, но я думаю, что важно знать о них:
- В зависимости от интерфейса хранилища данных Spring интерфейс хранилища связывается с библиотекой. Я не думаю, что это особая проблема, так как вы, вероятно, будете использовать такие абстракции, как
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
но не разоблачает манипулирующих. Подробнее об этом подходе читайте в справочной документации.
Резюме - tl; dr
Абстракция хранилища позволяет вам выбрать базовое хранилище, полностью ориентированное на ваши архитектурные и функциональные потребности. Используйте предоставляемые из коробки, если они подходят, создайте свои собственные базовые интерфейсы хранилища, если это необходимо. Держитесь подальше от хранилища определенных интерфейсов хранилища, если это неизбежно.
Резюме:
PagingAndSortingRepository расширяет CrudRepository
JpaRepository расширяет PagingAndSortingRepository
Интерфейс CrudRepository предоставляет методы для операций CRUD, поэтому он позволяет создавать, читать, обновлять и удалять записи, не определяя свои собственные методы.
PagingAndSortingRepository предоставляет дополнительные методы для извлечения сущностей, используя разбиение на страницы и сортировку.
Наконец, JpaRepository добавляет еще несколько функций, специфичных для JPA.
Ниже приведены различия между CrudRepository
а также JpaRepository
в качестве:
CrudRepository
CrudRepository
является базовым интерфейсом и расширяетRepository
интерфейс.CrudRepository
в основном предоставляет операции CRUD (создание, чтение, обновление, удаление).- Тип возврата
saveAll()
методIterable
. - Пример использования - для выполнения операций CRUD определите расширение репозитория.
CrudRepository
.
JpaRepository
JpaRepository
расширяетPagingAndSortingRepository
что расширяетCrudRepository
.JpaRepository
предоставляет операции CRUD и пагинации, а также дополнительные методы, такие какflush()
,saveAndFlush()
, а такжеdeleteInBatch()
, так далее.- Тип возврата
saveAll()
метод - этоList
. - Вариант использования - для выполнения CRUD, а также пакетных операций определите расширение репозитория.
JpaRepository
.
Недавнее обновление,
По состоянию на
spring-data-jpa 3.x
используется си
spring-core 6.x
,
структура и иерархия были изменены и кажутся более четкими.
расширяет
расширяет
расширяет оба , .
Таким образом, в основном новые представленные интерфейсы теперь представляют собой функциональные возможности старых интерфейсов, но с возвращаемыми типамив то время как остальные обрабатывают возвращаемые типы
Iterable<T>
В новой (3.x) версии структура следующая:
В прошлом (до версии 3.0) многие объявленные методы возвращали
List<T>
были объявлены непосредственно внутри , но теперь с отдельными интерфейсами для тех методов, в которые они были извлечены.ListPagingAndSortingRepository
, .
Итак, структура до (3.x) была
Надеюсь, из приведенных выше схем понятно, как упомянутыеJpaRepository
и были изменены в версии.
Если вы планируете мигрировать
spring-data-jpa
от2.x
в3.x
(было бы необходимо, если вы мигрируете с
spring-boot 2.x
к
spring-boot 3.x
), как показано на приведенных выше схемах, вы должны ожидать наличия ломаного кода в тех случаях, когда вы использовали в своем коде, как в прошлом, из которого он расширялся, и поэтому ваш пользовательский репозиторий, который расширял непосредственноPagingAndSortingRepository
уже имел доступ к методам . Если это проблема, вы должны исправить это, адаптировав свой пользовательский репозиторий, чтобы также расширить либоListCrudRepository
илиCrudRepository
.
Все ответы дают достаточно подробностей по этому вопросу. Однако позвольте мне добавить еще кое-что.
Почему мы используем эти интерфейсы:
- Они позволяют 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, и в большинстве случаев вы, вероятно, даже не будете использовать дополнительные методы, предоставляемые им.
В чем разница между интерфейсами CrudRepository и JpaRepository в Spring Data JPA?
Spring Data JPA предоставляет оба интерфейса и для упрощения создания репозиториев для доступа к данным в приложениях на основе JPA.
— это базовый интерфейс для сущностей с базовыми операциями CRUD (создание, чтение, обновление, удаление). предоставляет минимальный набор методов, таких какsave()
,findAll()
,findById()
,delete()
и т. д. и может быть расширен другими пользовательскими методами.
Это пример кода:
public interface PersonEntityRepository extends CrudRepository<PersonEntity, Long> {
}
интерфейс расширяет интерфейс. Интерфейс предоставляет другие дополнительные методы к основным операциям CRUD, предоставляемым CrudRepository, например:
-
findAll(Sort sort)
— метод, который возвращает все объекты, отсортированные по заданным критериям. -
findAll(Pageable pageable)
— метод, который возвращает страницу объектов в соответствии с заданными критериями разбиения на страницы и сортировки. -
flush()
— метод, который сбрасывает все ожидающие изменения в базу данных. -
saveAndFlush(T entity)
— метод, который сохраняет объект и немедленно сбрасывает изменения в базу данных. Это пример кода:
public interface PersonEntityRepository extends JpaRepository<PersonEntity, Long> {
List<TestEntity> findByName(String name);
List<Employee> findByAgeGreaterThan(double age);
}
Почему вы хотите использовать один вместо другого?
Выбор между ними зависит от конкретных потребностей вашего приложения. Я бы рекомендовал использоватьCrudRepository
интерфейс для основных операций CRUD иJpaRepository
интерфейс для более продвинутых функций, таких как нумерация страниц, сортировка и немедленная очистка изменений в базе данных.
Crud Repository - это базовый интерфейс, который действует как интерфейс маркера.
Репозиторий JPA также расширяет репозиторий PagingAndSorting. Он предоставляет все методы, полезные для реализации разбивки на страницы. В Crud Repository нет методов для реализации разбивки на страницы и сортировки.
JpaRepository расширяет CrudRepository и наследует некоторые методы, доступные в CrudRepository, такие как findOne, get и т. Д. JpaRepository также расширяет возможности использования PagingAndSorting Repository для разбивки на страницы и сортировки.
CrudRepository и PagingAndSortingRepository являются базовыми интерфейсами библиотеки Spring Core и имеют следующие функции:
- CrudRepository - предоставляет операции CRUD.
- PagingAndSortingRepository - предоставляет методы для разбивки на страницы и сортировки записей.
- JpaRepository - предоставляет некоторые связанные с JPA методы, такие как очистка контекста постоянства и удаление записей в пакете.
Разница между CrudRepository и JpaRepository