Spring Data JPA中CrudRepository和JpaRepository接口之间有什么区别?

xqk2d5yq  于 2022-11-24  发布在  Spring
关注(0)|答案(8)|浏览(205)

Spring Data JPA中的CrudRepositoryJpaRepository接口有何区别?
当我在网上看到这些例子时,我看到它们在那里可以互换使用。
它们之间有什么区别?
为什么要使用其中一个而不是另一个?

bbuxkriu

bbuxkriu1#

JpaRepository扩展PagingAndSortingRepositoryPagingAndSortingRepository又扩展CrudRepository
它们的主要职能是:

由于上面提到的继承,JpaRepository将拥有CrudRepositoryPagingAndSortingRepository的所有函数。因此,如果您不需要仓库拥有JpaRepositoryPagingAndSortingRepository提供的函数,请使用CrudRepository

q9yhzks0

q9yhzks02#

Ken的回答基本上是正确的,但我想补充一下你问题中的“为什么要使用一个而不是另一个?”

基础知识

您为存储库选择的基本接口有两个主要目的。首先,您允许Spring Data存储库基础结构找到您的接口并触发代理创建,以便将接口的示例注入到客户机中。第二个目的是根据需要将尽可能多的功能引入到接口中,而不必声明额外的方法。

通用接口

Spring Data核心库附带了两个基本接口,它们公开了一组专用的功能:

  • CrudRepository- CRUD方法
  • PagingAndSortingRepository-分页和排序的方法(扩展CrudRepository

特定于商店的接口

单个存储模块(例如,对于JPA或MongoDB)公开了这些基本接口的特定于存储的扩展,以允许访问特定于存储的功能,如刷新或专用批处理,这些功能考虑了一些存储的具体情况。例如,JpaRepositorydeleteInBatch(…)delete(…)不同,因为它使用查询来删除给定实体,后者的性能更高,但附带不触发JPA定义的级联(如规范所定义)的副作用。
我们通常建议 * 不要 * 使用这些基本接口,因为它们向客户端公开了底层的持久性技术,从而加强了客户端和存储库之间的耦合。另外,你会有点偏离存储库的原始定义,基本上是“实体的集合”。所以如果可以的话,还是使用PagingAndSortingRepository吧。

自定义存储库基本接口

直接依赖于提供的基本接口有两个缺点。这两个缺点可能都被认为是理论上的,但我认为它们是重要的,需要注意:
1.**根据Spring Data仓库接口的不同,仓库接口与库的耦合。**我不认为这是一个特殊的问题,因为您可能会在代码中使用抽象,如PagePageable。Spring Data与任何其他通用库(如commons-lang或Guava)没有任何不同。只要它提供合理的好处,它就很好。
1.**通过扩展(例如CrudRepository),您可以一次公开一组完整的持久性方法。**这在大多数情况下可能也没问题,但您可能会遇到这样的情况:您希望对公开的方法进行更细粒度的控制,例如创建一个不包括CrudRepositorysave(…)delete(…)方法的ReadOnlyRepository
解决这两个缺点的方法是创建你自己的基本仓库界面,甚至是一组基本仓库界面。

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

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

  // Al finder methods go here
}

第一个仓库接口是一些通用的基本接口,它实际上只修复了第一点,但为了一致性,还将ID类型绑定为Long。第二个接口通常具有从CrudRepositoryPagingAndSortingRepository复制的所有find…(…)方法,但不公开操作方法。请在参考文档中阅读更多关于该方法的信息。

摘要- tl;干燥

存储库抽象允许您选择完全由您的架构和功能需求驱动的基本存储库。如果合适,使用提供的开箱即用的存储库,如果必要,创建您自己的存储库基本接口。除非不可避免,否则远离特定于存储库的存储库接口。

w41d8nur

w41d8nur3#

    • 摘要:**
  • 分页和排序存储库扩展了CrudRepository
  • JpaRepository扩展了分页和排序存储库
    • CrudRepository**接口提供了CRUD操作的方法,因此它允许您创建、读取、更新和删除记录,而无需定义自己的方法。
    • PagingAndSortingRepository**提供了使用分页和排序检索实体的其他方法。

最后,JpaRepository添加了更多特定于JPA的功能。

izj3ouym

izj3ouym4#

我正在学习Spring Data JPA。它可能会对您有所帮助:

9lowa7mx

9lowa7mx5#

以下是CrudRepositoryJpaRepository之间的差异:

CrudRepository的名称

  1. CrudRepository是基本接口,它扩展了Repository接口。
  2. CrudRepository主要提供CRUD(创建、读取、更新、删除)操作。
  3. saveAll()方法的返回类型为Iterable
    1.用例-要执行CRUD操作,请定义扩展CrudRepository的存储库。

JpaRepository的名字

  1. JpaRepository扩展了PagingAndSortingRepository,而PagingAndSortingRepository扩展了CrudRepository
  2. JpaRepository提供CRUD和分页操作,以及flush()saveAndFlush()deleteInBatch()等其他方法。
  3. saveAll()方法的返回类型是List
    1.用例-要执行CRUD和批处理操作,请定义存储库扩展JpaRepository
sz81bmfz

sz81bmfz6#

所有的答案都提供了足够的细节,不过,让我再补充一点。

我们为什么要使用这些接口:

  • 它们允许Spring找到存储库接口并为其创建代理对象。
  • 它提供了一些方法,允许您执行一些常见的操作(您也可以定义自定义方法)。我喜欢这个特性,因为创建一个方法(定义查询和预准备语句,然后使用连接对象执行查询)来执行一个简单的操作真的很糟糕!
    哪个接口做什么:
    *CrudRepository:提供CRUD函数
    *分页和排序存储库:提供对记录进行分页和排序的方法
    *日本存储库:提供了与JPA相关的方法,如刷新持久性上下文和批量删除记录
    何时使用哪个接口:

根据http://jtuts.com/2014/08/26/difference-between-crudrepository-and-jparepository-in-spring-data-jpa/
通常,最好的方法是使用CrudRepositoryPagingAndSortingRepository,具体取决于您是否需要排序和分页。
如果可能的话,应该避免使用JpaRepository,因为它将存储库与JPA持久性技术联系在一起,在大多数情况下,您可能甚至不会使用它提供的额外方法。

u91tlkcl

u91tlkcl7#

Crud Repository是基本接口,它充当标记接口。
JPA存储库还扩展了PagingAndSorting存储库。
您可以参考- https://www.tutorialspoint.com/jpareository-in-java#:~:text= crud%20存储库是一个基本的、操作的标记接口。

gc0ot86w

gc0ot86w8#

最近更新,spring-data-jpa 3.x

自**spring-data-jpa 3.xspring-boot 3.xspring-core 6.x一起使用起,
其结构和层次已经修改,似乎更加明确。
ListCrudRepository扩展了CrudRepository
ListPagingAndSortingRepository扩展了PagingAndSortingRepository
JpaRepository同时扩展了ListCrudRepositoryListPagingAndSortingRepository
因此,基本上,新引入的ListPagingAndSortingRepositoryListCrudRepository接口现在表示旧接口的功能,但返回类型为
List<T>,而剩余的PagingAndSortingRepositoryCrudRepository处理Iterable<T>**的返回类型
在新的(3.x)版本中,结构如下:

在过去(Python 3.0之前),许多返回**List<T>**的声明方法都是直接在JpaRepository中声明的,但现在这些方法有了单独的接口,它们被提取到ListPagingAndSortingRepositoryListCrudRepository中。
因此(3.x)之前的结构是

我希望从上面的模式中可以清楚地看到,所提到的JpaRepositoryCrudRepository是如何在3.x版本中修改的。
如果您计划spring-data-jpa2.x迁移到3.x(如果您从spring-boot 2.x迁移到spring-boot 3.x,则这是必需的)如上面的模式所示,如果您在代码中使用了PagingAndSortingRepository,则应该会有中断代码,因为在过去它是从CrudRepository扩展的,所以直接扩展PagingAndSortingRepository的自定义存储库已经可以访问CrudRepository的方法。如果是这个问题,您应该通过调整自定义存储库以扩展ListCrudRepositoryCrudRepository来解决此问题。

相关问题