Spring Data JPA中的CrudRepository和JpaRepository接口有何区别?当我在网上看到这些例子时,我看到它们在那里可以互换使用。它们之间有什么区别?为什么要使用其中一个而不是另一个?
bbuxkriu1#
JpaRepository扩展PagingAndSortingRepository,PagingAndSortingRepository又扩展CrudRepository。它们的主要职能是:
JpaRepository
PagingAndSortingRepository
CrudRepository
由于上面提到的继承,JpaRepository将拥有CrudRepository和PagingAndSortingRepository的所有函数。因此,如果您不需要仓库拥有JpaRepository和PagingAndSortingRepository提供的函数,请使用CrudRepository。
q9yhzks02#
Ken的回答基本上是正确的,但我想补充一下你问题中的“为什么要使用一个而不是另一个?”
您为存储库选择的基本接口有两个主要目的。首先,您允许Spring Data存储库基础结构找到您的接口并触发代理创建,以便将接口的示例注入到客户机中。第二个目的是根据需要将尽可能多的功能引入到接口中,而不必声明额外的方法。
Spring Data核心库附带了两个基本接口,它们公开了一组专用的功能:
单个存储模块(例如,对于JPA或MongoDB)公开了这些基本接口的特定于存储的扩展,以允许访问特定于存储的功能,如刷新或专用批处理,这些功能考虑了一些存储的具体情况。例如,JpaRepository的deleteInBatch(…)与delete(…)不同,因为它使用查询来删除给定实体,后者的性能更高,但附带不触发JPA定义的级联(如规范所定义)的副作用。我们通常建议 * 不要 * 使用这些基本接口,因为它们向客户端公开了底层的持久性技术,从而加强了客户端和存储库之间的耦合。另外,你会有点偏离存储库的原始定义,基本上是“实体的集合”。所以如果可以的话,还是使用PagingAndSortingRepository吧。
deleteInBatch(…)
delete(…)
直接依赖于提供的基本接口有两个缺点。这两个缺点可能都被认为是理论上的,但我认为它们是重要的,需要注意:1.**根据Spring Data仓库接口的不同,仓库接口与库的耦合。**我不认为这是一个特殊的问题,因为您可能会在代码中使用抽象,如Page或Pageable。Spring Data与任何其他通用库(如commons-lang或Guava)没有任何不同。只要它提供合理的好处,它就很好。1.**通过扩展(例如CrudRepository),您可以一次公开一组完整的持久性方法。**这在大多数情况下可能也没问题,但您可能会遇到这样的情况:您希望对公开的方法进行更细粒度的控制,例如创建一个不包括CrudRepository的save(…)和delete(…)方法的ReadOnlyRepository。解决这两个缺点的方法是创建你自己的基本仓库界面,甚至是一组基本仓库界面。
Page
Pageable
save(…)
ReadOnlyRepository
interface ApplicationRepository<T> extends PagingAndSortingRepository<T, Long> { } interface ReadOnlyRepository<T> extends Repository<T, Long> { // Al finder methods go here }
第一个仓库接口是一些通用的基本接口,它实际上只修复了第一点,但为了一致性,还将ID类型绑定为Long。第二个接口通常具有从CrudRepository和PagingAndSortingRepository复制的所有find…(…)方法,但不公开操作方法。请在参考文档中阅读更多关于该方法的信息。
Long
find…(…)
存储库抽象允许您选择完全由您的架构和功能需求驱动的基本存储库。如果合适,使用提供的开箱即用的存储库,如果必要,创建您自己的存储库基本接口。除非不可避免,否则远离特定于存储库的存储库接口。
w41d8nur3#
最后,JpaRepository添加了更多特定于JPA的功能。
izj3ouym4#
我正在学习Spring Data JPA。它可能会对您有所帮助:
9lowa7mx5#
以下是CrudRepository与JpaRepository之间的差异:
Repository
saveAll()
Iterable
flush()
saveAndFlush()
deleteInBatch()
List
sz81bmfz6#
所有的答案都提供了足够的细节,不过,让我再补充一点。
我们为什么要使用这些接口:
根据http://jtuts.com/2014/08/26/difference-between-crudrepository-and-jparepository-in-spring-data-jpa/通常,最好的方法是使用CrudRepository或PagingAndSortingRepository,具体取决于您是否需要排序和分页。如果可能的话,应该避免使用JpaRepository,因为它将存储库与JPA持久性技术联系在一起,在大多数情况下,您可能甚至不会使用它提供的额外方法。
u91tlkcl7#
Crud Repository是基本接口,它充当标记接口。JPA存储库还扩展了PagingAndSorting存储库。您可以参考- https://www.tutorialspoint.com/jpareository-in-java#:~:text= crud%20存储库是一个基本的、操作的标记接口。
gc0ot86w8#
spring-data-jpa 3.x
自**spring-data-jpa 3.x与spring-boot 3.x和spring-core 6.x一起使用起,其结构和层次已经修改,似乎更加明确。ListCrudRepository扩展了CrudRepositoryListPagingAndSortingRepository扩展了PagingAndSortingRepositoryJpaRepository同时扩展了ListCrudRepository和ListPagingAndSortingRepository。因此,基本上,新引入的ListPagingAndSortingRepository、ListCrudRepository接口现在表示旧接口的功能,但返回类型为List<T>,而剩余的PagingAndSortingRepository、CrudRepository处理Iterable<T>**的返回类型在新的(3.x)版本中,结构如下:
spring-boot 3.x
spring-core 6.x
ListCrudRepository
ListPagingAndSortingRepository
List<T>
Iterable<T>
在过去(Python 3.0之前),许多返回**List<T>**的声明方法都是直接在JpaRepository中声明的,但现在这些方法有了单独的接口,它们被提取到ListPagingAndSortingRepository、ListCrudRepository中。因此(3.x)之前的结构是
我希望从上面的模式中可以清楚地看到,所提到的JpaRepository和CrudRepository是如何在3.x版本中修改的。如果您计划将spring-data-jpa从2.x迁移到3.x(如果您从spring-boot 2.x迁移到spring-boot 3.x,则这是必需的)如上面的模式所示,如果您在代码中使用了PagingAndSortingRepository,则应该会有中断代码,因为在过去它是从CrudRepository扩展的,所以直接扩展PagingAndSortingRepository的自定义存储库已经可以访问CrudRepository的方法。如果是这个问题,您应该通过调整自定义存储库以扩展ListCrudRepository或CrudRepository来解决此问题。
3.x
spring-data-jpa
2.x
spring-boot 2.x
8条答案
按热度按时间bbuxkriu1#
JpaRepository
扩展PagingAndSortingRepository
,PagingAndSortingRepository
又扩展CrudRepository
。它们的主要职能是:
CrudRepository
主要提供CRUD功能。PagingAndSortingRepository
提供了对记录进行分页和排序的方法。JpaRepository
提供了一些与JPA相关的方法,如刷新持久性上下文和批量删除记录。由于上面提到的继承,
JpaRepository
将拥有CrudRepository
和PagingAndSortingRepository
的所有函数。因此,如果您不需要仓库拥有JpaRepository
和PagingAndSortingRepository
提供的函数,请使用CrudRepository
。q9yhzks02#
Ken的回答基本上是正确的,但我想补充一下你问题中的“为什么要使用一个而不是另一个?”
基础知识
您为存储库选择的基本接口有两个主要目的。首先,您允许Spring Data存储库基础结构找到您的接口并触发代理创建,以便将接口的示例注入到客户机中。第二个目的是根据需要将尽可能多的功能引入到接口中,而不必声明额外的方法。
通用接口
Spring Data核心库附带了两个基本接口,它们公开了一组专用的功能:
CrudRepository
- CRUD方法PagingAndSortingRepository
-分页和排序的方法(扩展CrudRepository
)特定于商店的接口
单个存储模块(例如,对于JPA或MongoDB)公开了这些基本接口的特定于存储的扩展,以允许访问特定于存储的功能,如刷新或专用批处理,这些功能考虑了一些存储的具体情况。例如,
JpaRepository
的deleteInBatch(…)
与delete(…)
不同,因为它使用查询来删除给定实体,后者的性能更高,但附带不触发JPA定义的级联(如规范所定义)的副作用。我们通常建议 * 不要 * 使用这些基本接口,因为它们向客户端公开了底层的持久性技术,从而加强了客户端和存储库之间的耦合。另外,你会有点偏离存储库的原始定义,基本上是“实体的集合”。所以如果可以的话,还是使用
PagingAndSortingRepository
吧。自定义存储库基本接口
直接依赖于提供的基本接口有两个缺点。这两个缺点可能都被认为是理论上的,但我认为它们是重要的,需要注意:
1.**根据Spring Data仓库接口的不同,仓库接口与库的耦合。**我不认为这是一个特殊的问题,因为您可能会在代码中使用抽象,如
Page
或Pageable
。Spring Data与任何其他通用库(如commons-lang或Guava)没有任何不同。只要它提供合理的好处,它就很好。1.**通过扩展(例如
CrudRepository
),您可以一次公开一组完整的持久性方法。**这在大多数情况下可能也没问题,但您可能会遇到这样的情况:您希望对公开的方法进行更细粒度的控制,例如创建一个不包括CrudRepository
的save(…)
和delete(…)
方法的ReadOnlyRepository
。解决这两个缺点的方法是创建你自己的基本仓库界面,甚至是一组基本仓库界面。
第一个仓库接口是一些通用的基本接口,它实际上只修复了第一点,但为了一致性,还将ID类型绑定为
Long
。第二个接口通常具有从CrudRepository
和PagingAndSortingRepository
复制的所有find…(…)
方法,但不公开操作方法。请在参考文档中阅读更多关于该方法的信息。摘要- tl;干燥
存储库抽象允许您选择完全由您的架构和功能需求驱动的基本存储库。如果合适,使用提供的开箱即用的存储库,如果必要,创建您自己的存储库基本接口。除非不可避免,否则远离特定于存储库的存储库接口。
w41d8nur3#
最后,JpaRepository添加了更多特定于JPA的功能。
izj3ouym4#
我正在学习Spring Data JPA。它可能会对您有所帮助:
9lowa7mx5#
以下是
CrudRepository
与JpaRepository
之间的差异:CrudRepository
的名称CrudRepository
是基本接口,它扩展了Repository
接口。CrudRepository
主要提供CRUD(创建、读取、更新、删除)操作。saveAll()
方法的返回类型为Iterable
。1.用例-要执行CRUD操作,请定义扩展
CrudRepository
的存储库。JpaRepository
的名字JpaRepository
扩展了PagingAndSortingRepository
,而PagingAndSortingRepository
扩展了CrudRepository
。JpaRepository
提供CRUD和分页操作,以及flush()
、saveAndFlush()
和deleteInBatch()
等其他方法。saveAll()
方法的返回类型是List
。1.用例-要执行CRUD和批处理操作,请定义存储库扩展
JpaRepository
。sz81bmfz6#
所有的答案都提供了足够的细节,不过,让我再补充一点。
我们为什么要使用这些接口:
哪个接口做什么:
*CrudRepository:提供CRUD函数
*分页和排序存储库:提供对记录进行分页和排序的方法
*日本存储库:提供了与JPA相关的方法,如刷新持久性上下文和批量删除记录
何时使用哪个接口:
根据http://jtuts.com/2014/08/26/difference-between-crudrepository-and-jparepository-in-spring-data-jpa/
通常,最好的方法是使用CrudRepository或PagingAndSortingRepository,具体取决于您是否需要排序和分页。
如果可能的话,应该避免使用JpaRepository,因为它将存储库与JPA持久性技术联系在一起,在大多数情况下,您可能甚至不会使用它提供的额外方法。
u91tlkcl7#
Crud Repository是基本接口,它充当标记接口。
JPA存储库还扩展了PagingAndSorting存储库。
您可以参考- https://www.tutorialspoint.com/jpareository-in-java#:~:text= crud%20存储库是一个基本的、操作的标记接口。
gc0ot86w8#
最近更新,
spring-data-jpa 3.x
自**
spring-data-jpa 3.x
与spring-boot 3.x
和spring-core 6.x
一起使用起,其结构和层次已经修改,似乎更加明确。
ListCrudRepository
扩展了CrudRepository
ListPagingAndSortingRepository
扩展了PagingAndSortingRepository
JpaRepository
同时扩展了ListCrudRepository
和ListPagingAndSortingRepository
。因此,基本上,新引入的
ListPagingAndSortingRepository
、ListCrudRepository
接口现在表示旧接口的功能,但返回类型为List<T>
,而剩余的PagingAndSortingRepository
、CrudRepository
处理Iterable<T>
**的返回类型在新的(3.x)版本中,结构如下:
在过去(Python 3.0之前),许多返回**
List<T>
**的声明方法都是直接在JpaRepository
中声明的,但现在这些方法有了单独的接口,它们被提取到ListPagingAndSortingRepository
、ListCrudRepository
中。因此(3.x)之前的结构是
我希望从上面的模式中可以清楚地看到,所提到的
JpaRepository
和CrudRepository
是如何在3.x
版本中修改的。如果您计划将
spring-data-jpa
从2.x
迁移到3.x
(如果您从spring-boot 2.x
迁移到spring-boot 3.x
,则这是必需的)如上面的模式所示,如果您在代码中使用了PagingAndSortingRepository
,则应该会有中断代码,因为在过去它是从CrudRepository
扩展的,所以直接扩展PagingAndSortingRepository
的自定义存储库已经可以访问CrudRepository
的方法。如果是这个问题,您应该通过调整自定义存储库以扩展ListCrudRepository
或CrudRepository
来解决此问题。