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

kse*_*ker 603 java spring jpa spring-data spring-data-jpa

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

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

Ken*_*han 831

JpaRepository延伸PagingAndSortingRepository,反过来延伸CrudRepository.

他们的主要职能是:

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

  • 并在findAll()中返回List <>而不是Iterable <> :-) (119认同)
  • @Hinotori (2认同)

Oli*_*ohm 372

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

基本

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

通用接口

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

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

特定于商店的界面

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

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

自定义存储库基接口

直接依赖于所提供的基本接口之一的缺点是双重的.它们都可能被认为是理论上的,但我认为重要的是要注意:

  1. 根据Spring Data存储库接口,将存储库接口与库耦合.我不认为这是一个特殊问题,因为你可能会使用类似代码PagePageable代码中的抽象.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
}
Run Code Online (Sandbox Code Playgroud)

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

摘要 - tl;博士

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


Job*_*ews 70

在此输入图像描述

摘要:

  • PagingAndSortingRepository扩展了CrudRepository

  • JpaRepository扩展了PagingAndSortingRepository

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

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

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


Pan*_*kos 19

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

spring-data-jpa 3.xspring-boot 3.x和 一起使用时spring-core 6.x

结构和层次结构已被修改,似乎更加清晰。

ListCrudRepository延伸CrudRepository

ListPagingAndSortingRepository延伸PagingAndSortingRepository

JpaRepository延伸两者ListCrudRepositoryListPagingAndSortingRepository.

ListPagingAndSortingRepository因此,基本上,新引入的接口ListCrudRepository现在代表旧接口的功能,但具有返回类型,而List<T>其余的则处理返回类型PagingAndSortingRepositoryCrudRepositoryIterable<T>

在新的(3.x)版本中,结构如下:

在此输入图像描述

在过去(3.0 之前),许多返回的已声明方法List<T>都是直接在 中声明的JpaRepository,但现在这些方法具有单独的接口,它们已被提取到ListPagingAndSortingRepository,中ListCrudRepository

所以(3.x)之前的结构是

在此输入图像描述

我希望从上面的模式中可以清楚地看到提到的JpaRepositoryCrudRepository是如何在版本中修改的3.x

如果您计划从into迁移spring-data-jpa(如果您从to迁移则有必要),如上面的模式所示,您应该预期在代码中使用了 the 的情况下会出现破坏代码,就像过去它是从因此,您的自定义存储库直接扩展了已经可以访问. 如果这是问题,您应该通过调整自定义存储库以扩展或.2.x3.xspring-boot 2.xspring-boot 3.xPagingAndSortingRepositoryCrudRepositoryPagingAndSortingRepositoryCrudRepositoryListCrudRepositoryCrudRepository


Ani*_*rgi 18

下面是之间的差异CrudRepositoryJpaRepositoryas:

CrudRepository

  1. CrudRepository是一个基本接口并扩展了该Repository接口。
  2. CrudRepository 主要提供CRUD(Create、Read、Update、Delete)操作。
  3. saveAll()方法的返回类型是Iterable
  4. 用例 - 要执行 CRUD 操作,请定义存储库扩展CrudRepository.

JpaRepository

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


Eva*_*mas 12

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


Zuf*_*tov 9

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

Spring Data JPA 提供JpaRepositoryCrudRepository接口来简化基于 JPA 的应用程序中数据访问的存储库的创建。

CrudRepository是具有基本 CRUD(创建、读取、更新、删除)操作的实体的基本接口。CrudRepository提供了一组最小的方法,例如save()findAll()findById()delete()等,并且可以通过其他自定义方法进行扩展。

这是代码示例:

public interface PersonEntityRepository extends CrudRepository<PersonEntity, Long> {

}
Run Code Online (Sandbox Code Playgroud)

JpaRepository接口扩展CrudRepository接口。 JpaRepository接口为 CrudRepository 提供的基本 CRUD 操作提供了其他附加方法,例如:

  • findAll(Sort sort)- 返回按给定条件排序的所有实体的方法。
  • findAll(Pageable pageable)- 根据给定的分页和排序标准返回实体页面的方法。
  • flush() - 刷新数据库中所有挂起的更改的方法。
  • saveAndFlush(T entity)- 保存实体并立即将更改刷新到数据库的方法。这是代码示例:
public interface PersonEntityRepository extends JpaRepository<PersonEntity, Long> {

    List<TestEntity> findByName(String name);

    List<Employee> findByAgeGreaterThan(double age);
}
Run Code Online (Sandbox Code Playgroud)

为什么你想使用其中一种而不是另一种?

两者之间的选择取决于您的应用程序的具体需求。我建议使用CrudRepository用于基本 CRUD 操作的接口,以及JpaRepository用于更高级功能的接口,例如分页、排序和立即刷新数据库更改。


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