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

时间:2012-12-23 19:35:12

标签: java spring jpa spring-data spring-data-jpa

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

当我在网上看到这些例子时,我看到它们在那里可以互换使用。他们之间有什么区别?你为什么要用另一个呢?

7 个答案:

答案 0 :(得分:701)

JpaRepository扩展PagingAndSortingRepository,后者又扩展CrudRepository

他们的主要职能是:

由于上述继承,JpaRepository将具有CrudRepositoryPagingAndSortingRepository的所有功能。因此,如果您不需要存储库具有JpaRepositoryPagingAndSortingRepository提供的功能,请使用CrudRepository

答案 1 :(得分:341)

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

基本

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

常用接口

Spring Data核心库附带两个基本接口,可以显示一组专用的功能:

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

特定于商店的接口

单个商店模块(例如,用于JPA或MongoDB)公开这些基本接口的特定于商店的扩展,以允许访问特定于商店的功能,例如刷新或专用批处理,其中考虑了一些商店细节。这方面的一个例子是deleteInBatch(…) JpaRepositorydelete(…)不同,因为它使用查询删除给定的实体,这些实体性能更高但带有不触发JPA的副作用-defined cascades(如规范定义的那样)。

我们通常建议使用这些基本接口,因为它们将底层持久性技术暴露给客户端,从而加强它们与存储库之间的耦合。另外,您从存储库的原始定义中获得了一点点,该存储库基本上是“实体集合”。如果可以的话,请留下PagingAndSortingRepository

自定义存储库基本接口

直接依赖于其中一个提供的基础接口的缺点是双重的。它们都可能被认为是理论上的,但我认为重要的是要注意:

  1. 根据Spring Data存储库接口将存储库接口与库耦合。我不认为这是一个特殊问题,因为您可能会使用Page或{之类的抽象。无论如何,在您的代码中{1}}。 Spring Data与commons-lang或Guava等任何其他通用库没有任何不同。只要它提供合理的利益,就可以了。
  2. 通过扩展,例如Pageable,你会立即公开一套完整的持久性方法。这在大多数情况下都可能很好但是你可能会遇到你想要获得更细粒度控制的情况。方法暴露,例如创建不包含CrudRepository的{​​{1}}和ReadOnlyRepository方法的save(…)
  3. 这两个缺点的解决方案是制作您自己的基础存储库接口甚至是一组它们。在很多应用程序中,我看到过类似的东西:

    delete(…)

    第一个存储库接口是一些通用基本接口,它实际上只修复了第1点,但也将ID类型绑定为CrudRepository以保持一致性。第二个界面通常包含从interface ApplicationRepository<T> extends PagingAndSortingRepository<T, Long> { } interface ReadOnlyRepository<T> extends Repository<T, Long> { // Al finder methods go here } Long复制的所有find…(…)方法,但不会公开操纵的方法。在reference documentation中了解有关该方法的更多信息。

    摘要 - tl; dr

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

答案 2 :(得分:50)

enter image description here

<强>要点:

  • PagingAndSortingRepository扩展了CrudRepository

  • JpaRepository扩展了PagingAndSortingRepository

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

PagingAndSortingRepository 提供了使用分页和排序检索实体的其他方法。

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

答案 3 :(得分:8)

以下是CrudRepositoryJpaRepository之间的区别,如下:

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()方法的返回类型为List
  4. 用例-要执行CRUD和批处理操作,请定义存储库扩展JpaRepository

答案 4 :(得分:4)

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

我们为什么要使用这些界面:

  • 它们允许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持久性技术联系在一起,在大多数情况下,您甚至可能不会使用它提供的额外方法。

答案 5 :(得分:2)

简而言之,

PagingAndSortingRepository 扩展了 CrudRepository

JpaRepository 扩展了 PagingAndSortingRepository

在使用Spring Data JPA 时,您应该了解三个重要的存储库接口:

  1. CrudRepository 接口提供了用于CRUD操作的方法,因此,您无需定义自己的方法即可创建,读取,更新和删除记录。
  2. PagingAndSortingRepository 提供了使用分页和排序来检索实体的其他方法。
  3. JpaRepository 具有其他JPA特定方法,例如,支持Query By Example,批量删除,手动刷新数据库更改和查询方法返回index而不是{{1} }

所有这些存储库接口直接或间接扩展了顶级Spring Data 存储库接口。

答案 6 :(得分:0)

我正在学习“ spring data jpa”。这可能对您有帮助。 enter image description here