921

Spring Data JPA中的CrudRepositoryJpaRepository接口有什么区别?

当我在网上看到这些例子时,我看到它们在那里可以互换使用。

它们之间有什么区别?

为什么要使用其中一个而不是另一个?

4

7 回答 7

1273

JpaRepository扩展PagingAndSortingRepository而扩展CrudRepository

它们的主要功能是:

由于上面提到的继承, JpaRepository将具有CrudRepository和的所有功能PagingAndSortingRepository。因此,如果您不需要存储库具有 and 提供的功能JpaRepository,请PagingAndSortingRepository使用CrudRepository.

于 2012-12-24T19:36:34.490 回答
451

肯的​​回答基本上是正确的,但我想插话“你为什么要使用一个而不是另一个?” 你问题的一部分。

基本

您为存储库选择的基本接口有两个主要用途。首先,您允许 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. 通过扩展 eg 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 点,但也绑定了 ID 类型以Long保持一致性。第二个接口通常具有find…(…)从其中复制的所有方法CrudRepositoryPagingAndSortingRepository但不公开操作方法。在参考文档中阅读有关该方法的更多信息。

摘要-tl;博士

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

于 2013-12-26T11:25:27.650 回答
109

在此处输入图像描述

概括:

  • PagingAndSortingRepository 扩展 CrudRepository

  • JpaRepository 扩展了 PagingAndSortingRepository

CrudRepository接口提供了用于 CRUD 操作的方法,因此它允许您创建、读取、更新和删除记录,而无需定义自己的方法。

PagingAndSortingRepository提供了额外的方法来使用分页和排序检索实体。

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

于 2018-03-10T06:02:15.987 回答
26

我正在学习 Spring Data JPA。它可能会帮助您: 在此处输入图像描述

于 2019-04-07T04:57:00.393 回答
23

CrudRepository以下是和as之间的区别JpaRepository

CrudRepository

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

JpaRepository

  1. JpaRepository延伸PagingAndSortingRepository那个延伸CrudRepository
  2. JpaRepository提供 CRUD 和分页操作,以及其他方法,如flush()saveAndFlush()deleteInBatch()等。
  3. 方法的返回类型saveAll()是 a List
  4. 用例 - 要执行 CRUD 以及批处理操作,请定义存储库扩展JpaRepository
于 2020-06-25T01:56:54.850 回答
6

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

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

  • 它们允许 Spring 找到您的存储库接口并为它们创建代理对象。
  • 它为您提供了允许您执行一些常见操作的方法(您也可以定义您的自定义方法)。我喜欢这个功能,因为创建一个方法(并定义查询和准备好的语句,然后使用连接对象执行查询)来做一个简单的操作真的很糟糕!

哪个接口做什么:

  • CrudRepository : 提供 CRUD 功能
  • PagingAndSortingRepository : 提供分页和排序记录的方法
  • JpaRepository:提供JPA相关的方法,例如刷新持久化上下文和批量删除记录

何时使用哪个接口:

根据http://jtuts.com/2014/08/26/difference-between-crudrepository-and-jparepository-in-spring-data-jpa/

一般来说,最好的办法是使用CrudRepositoryPagingAndSortingRepository,具体取决于您是否需要排序和分页。

如果可能,应该避免使用JpaRepository ,因为它将存储库与 JPA 持久性技术联系在一起,并且在大多数情况下,您甚至可能不会使用它提供的额外方法。

于 2020-01-10T20:46:51.770 回答
0

Crud Repository 是基本接口,它充当标记接口。

JPA 存储库还扩展了 PagingAndSorting 存储库。它提供了所有对实现分页有用的方法。Crud Repository 不提供实现分页和排序的方法

您可以参考 - https://www.tutorialspoint.com/difference-between-crudrepository-and-jparepository-in-java#:~:text=Crud%20Repository%20is%20the%20base,acts%20as%20a%20marker %20interface.&text=JPA%20repository%20also%20extends%20the,for%20implementing%20pagination%20and%20sorting

于 2021-09-28T07:00:37.030 回答