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

问题

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

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


#1 热门回答(524 赞)

JpaRepositoryextendsPagingAndSortingRepository其中又延伸了CrudRepository

他们的主要职能是:

  • CrudRepository主要提供CRUD功能。
  • PagingAndSortingRepository提供了进行分页和排序记录的方法。
  • JpaRepository提供了一些与JPA相关的方法,例如刷新持久化上下文和批量删除记录。

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


#2 热门回答(278 赞)

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

基本

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

##常用接口

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

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

##特定于商店的界面

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

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

##自定义存储库基础接口

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

  • 根据Spring Data存储库接口,将存储库接口与库耦合。我不认为这是一个特殊的问题,因为你可能会在你的代码中使用像Page或Pageable这样的抽象。 Spring Data与commons-lang或Guava等任何其他通用库没有任何不同。只要它提供合理的利益,就可以了。
  • 通过扩展,例如CrudRepository,你可以立即公开一套完整的持久性方法。在大多数情况下,这可能也很好,但是你可能会遇到这样的情况,即你希望对公开的方法进行更细粒度的控制,例如:创建一个不包含CrudRepository的save(...)和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…(…)方法但不暴露操纵的那些方法。请阅读reference documentation中有关该方法的更多信息。

##摘要 - tl;博士

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


#3 热门回答(19 赞)

enter image description here
摘要:- PagingAndSortingRepository扩展了CrudRepository

  • JpaRepository扩展了PagingAndSortingRepository

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

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

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