ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

它们之间有什么区别?

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

另请阅读本文的 Introduction to Spring Data Repositories 部分

K
Ken Chan

JpaRepository 扩展了 PagingAndSortingRepository,而 PagingAndSortingRepository 又扩展了 CrudRepository

它们的主要功能是:

CrudRepository 主要提供 CRUD 功能。

PagingAndSortingRepository 提供了对记录进行分页和排序的方法。

JpaRepository 提供了一些 JPA 相关的方法,例如刷新持久化上下文和批量删除记录。

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


并在 findAll() 中返回 List<> 而不是 Iterable<> :-)
S
Stimpson Cat

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

基本

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

常用接口

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

CrudRepository - CRUD 方法

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

商店特定的界面

各个存储模块(例如,用于 JPA 或 MongoDB)公开了这些基本接口的特定于存储的扩展,以允许访问特定于存储的功能,例如将某些存储细节考虑在内的刷新或专用批处理。这方面的一个示例是 JpaRepositorydeleteInBatch(…),它与 delete(…) 不同,因为它使用查询来删除性能更高的给定实体,但具有不触发 JPA 定义的级联的副作用(作为规范定义了它)。

我们一般建议不要使用这些基本接口,因为它们将底层持久性技术暴露给客户端,从而加强它们与存储库之间的耦合。另外,您与存储库的原始定义有所不同,它基本上是“实体的集合”。因此,如果可以,请继续使用 PagingAndSortingRepository

自定义存储库基础接口

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

依赖于 Spring Data 存储库接口将你的存储库接口耦合到库。我不认为这是一个特别的问题,因为无论如何您可能会在代码中使用 Page 或 Pageable 之类的抽象。 Spring Data 与任何其他通用库(如 commons-lang 或 Guava)没有任何不同。只要它提供合理的好处,就可以了。通过扩展例如 CrudRepository,您可以立即公开一套完整的持久性方法。这在大多数情况下也可能没问题,但您可能会遇到希望对公开的方法进行更细粒度控制的情况,例如创建不包含 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 以保持一致性。第二个接口通常包含从 CrudRepositoryPagingAndSortingRepository 复制的所有 find…(…) 方法,但不公开操作方法。在 reference documentation 中阅读有关该方法的更多信息。

摘要-tl;博士

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


J
Joby Wilson Mathews

https://i.stack.imgur.com/ee7XF.jpg

概括:

PagingAndSortingRepository 扩展 CrudRepository

JpaRepository 扩展了 PagingAndSortingRepository

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

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

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


“扩展存储库<>”怎么样?它会有哪些方法?和 CrudRepository 一样吗?
I
Ihor Patsian

https://i.stack.imgur.com/SBx4b.png


你好,不错的方案。请问您使用哪种工具来生成这种方案?
S
Seth Falco

以下是 CrudRepositoryJpaRepository 之间的区别:

Crud存储库

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

JpaRepository

JpaRepository 扩展了扩展 CrudRepository 的 PagingAndSortingRepository。 JpaRepository 提供 CRUD 和分页操作,以及诸如 flush()、saveAndFlush() 和 deleteInBatch() 等附加方法。 saveAll() 方法的返回类型是 List。用例 - 要执行 CRUD 以及批处理操作,请定义存储库扩展 JpaRepository。


M
MeanwhileInHell

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

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

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


A
Anusha SP

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


CrudRepository 不是标记界面。 baeldung.com/…。此外,在代码中检查它的实例很少(可能为 0),因此它也不能作为一个实例。