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


Answers:


954

JpaRepository延伸PagingAndSortingRepository,延伸CrudRepository

它们的主要功能是:

由于继承如上所述, JpaRepository将所有的功能CrudRepositoryPagingAndSortingRepository。所以,如果你不需要的仓库有提供的功能JpaRepositoryPagingAndSortingRepository,使用CrudRepository


142
并在findAll()中返回List <>而不是Iterable <> :-)
Hinotori 2016年

396

Ken的回答基本上是正确的,但我想提一下“您为什么要在另一个上使用一个?” 您的问题的一部分。

基本

您为存储库选择的基本接口有两个主要目的。首先,您允许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; dr

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


84

在此处输入图片说明

摘要:

  • PagingAndSortingRepository扩展了CrudRepository

  • JpaRepository扩展了PagingAndSortingRepository

CrudRepository接口提供方法CRUD操作,所以它可以让你不必定义你自己的方法创建,读取,更新和删除记录。

PagingAndSortingRepository提供更多的方法来检索使用分页和排序实体。

最后,JpaRepository添加了一些特定于JPA的功能。


那“扩展存储库<>”呢?它有哪些方法?与CrudRepository相同?
s-kaczmarek

15

我正在学习Spring Data JPA。它可能会帮助您: 在此处输入图片说明


3

所有答案都为问题提供了足够的细节。但是,让我添加更多内容。

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

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

哪个接口做什么?

  • Crud存储库:提供CRUD功能
  • PagingAndSortingRepository:提供执行分页和排序记录的方法
  • JpaRepository:提供与JPA相关的方法,例如刷新持久性上下文并删除批处理中的记录

何时使用哪个界面:

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

通常,最好的方法是使用CrudRepositoryPagingAndSortingRepository,具体取决于您是否需要排序和分页。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.