Spring Data JPA中CrudRepostory和JpaRepostory接口有什么区别?

Spring Data JPA中的代码仓库jpareposaku接口有什么区别?

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

它们之间有什么区别?

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

419603 次浏览

JpaRepository延伸PagingAndSortingRepository,反过来延伸CrudRepository

它们的主要职能是:

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

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

基础

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

常见的接口

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

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

特定于商店的接口

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

我们通常建议没有使用这些基本接口,因为它们向客户端公开了底层持久性技术,从而加强了它们与存储库之间的耦合。另外,你有点偏离存储库的原始定义,基本上是“实体的集合”。所以如果可以,请使用PagingAndSortingRepository

自定义存储库基础接口

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

  1. 根据Spring Data存储库接口将您的存储库接口与库耦合。我不认为这是一个特殊的问题,因为无论如何你都可能会在代码中使用像PagePageable这样的抽象。Spring Data与任何其他通用库(如Commons-lang或Guava)没有任何不同。只要它提供合理的好处,就可以了。
  2. 通过扩展例如#0,您可以一次公开一组完整的持久性方法。这在大多数情况下也可能很好,但您可能会遇到这样的情况,即您希望对暴露的方法进行更细粒度的控制,例如创建一个不包括CrudRepositorysave(…)delete(…)方法的ReadOnlyRepository

这两个缺点的解决方案是制作自己的基本存储库接口,甚至是一组。在很多应用程序中,我见过这样的东西:

interface ApplicationRepository<T> extends PagingAndSortingRepository<T, Long> { }
interface ReadOnlyRepository<T> extends Repository<T, Long> {
// Al finder methods go here}

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

摘要-tl; dr

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

在此处输入图片描述

总结:

  • PagingAndSorting Repostory扩展CrudRepostory

  • JpaReposential扩展PagingAndSorting Reposential

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

分页和排序存储库提供了使用分页和排序检索实体的附加方法。

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

我正在学习Spring Data JPA。它可能会帮助你:输入图片描述

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

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

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

哪个接口做什么:

  • 代码仓库:提供CRUD函数
  • 分页和排序存储库:提供对记录进行分页和排序的方法
  • jpareposaku:提供与JPA相关的方法,例如刷新持久性上下文和批量删除记录

什么时候用哪个接口:

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

一般来说,最好的主意是使用代码仓库分页和排序存储库,具体取决于您是否需要排序和分页。

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

以下是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

Crud存储库是基础接口,它充当标记接口。

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

您可以参考-https://www.tutorialspoint.com/difference-between-crudrepository-and-jparepository-in-java#:~: text=Crud%20Repostory%20is%20the%20base,行为%20as%20a%20标记%20接口。&text=JPA%20repostory%20也%20延伸%20the,用于%20实现%20分页%20and%20排序

最近更新,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)版本中,结构如下:

输入图片描述

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

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

输入图片描述

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

如果您计划将2.x1从2.x迁移到3.x(如果您从2.x2迁移到2.x3,这是必要的),如上述模式所示,您应该期望在代码中使用PagingAndSortingRepository的情况下会有破坏代码,因为过去它是从CrudRepository扩展的,因此您的自定义存储库直接扩展了PagingAndSortingRepository已经可以访问CrudRepository的方法。如果这是问题,您应该通过调整您的自定义存储库以扩展ListCrudRepositoryCrudRepository来解决此问题。