Depending on a Spring Data repository interface couples your repository interface to the library. 我不会在你的代码中使用像 Page 或 Pageable 这样的抽象 . Spring Data与commons-lang或Guava等任何其他通用库没有任何不同 . 只要它提供合理的利益,就可以了 .
By extending e.g. CrudRepository, you expose a complete set of persistence method at once. 这在大多数情况下都可能没问题,但是你可能会遇到一些情况,你希望对暴露的方法进行更细粒度的控制,例如:创建 ReadOnlyRepository ,不包括 CrudRepository 的 save(…) 和 delete(…) 方法 .
interface ApplicationRepository<T> extends PagingAndSortingRepository<T, Long> { }
interface ReadOnlyRepository<T> extends Repository<T, Long> {
// Al finder methods go here
}
3 回答
肯的答案基本上是正确的,但我想谈谈“你为什么要用一个而不是另一个?”你问题的一部分 .
基础知识
您为存储库选择的基本接口有两个主要目的 . 首先,您允许Spring Data存储库基础结构查找您的接口并触发代理创建,以便将接口实例注入客户端 . 第二个目的是在界面中引入尽可能多的功能,而不必声明额外的方法 .
常用接口
Spring Data核心库附带两个基本接口,可显示一组专用功能:
CrudRepository
- CRUD方法PagingAndSortingRepository
- 分页和排序方法(扩展CrudRepository
)特定于商店的接口
各个商店模块(例如,用于JPA或MongoDB)公开这些基本接口的特定于商店的扩展,以允许访问特定于商店的功能,例如将一些商店细节考虑在内的刷新或专用批处理 . 这方面的一个例子是
deleteInBatch(…)
JpaRepository
,它与delete(…)
不同,因为它使用查询删除给定的实体,这些实体性能更高,但副作用是不触发JPA定义的级联(如规范定义的那样) .我们通常建议不要使用这些基接口,因为它们将底层持久性技术暴露给客户端,从而加强它们与存储库之间的耦合 . 另外,您从存储库的原始定义中获得了一点点,基本上是"a collection of entities" . 所以如果可以,请留下
PagingAndSortingRepository
.自定义存储库基础接口
直接依赖于所提供的基础接口之一的缺点是双重的 . 它们都可能被认为是理论上的,但我认为重要的是要注意:
Depending on a Spring Data repository interface couples your repository interface to the library. 我不会在你的代码中使用像
Page
或Pageable
这样的抽象 . Spring Data与commons-lang或Guava等任何其他通用库没有任何不同 . 只要它提供合理的利益,就可以了 .By extending e.g. CrudRepository, you expose a complete set of persistence method at once. 这在大多数情况下都可能没问题,但是你可能会遇到一些情况,你希望对暴露的方法进行更细粒度的控制,例如:创建
ReadOnlyRepository
,不包括CrudRepository
的save(…)
和delete(…)
方法 .这两个缺点的解决方案是制作您自己的基础存储库接口甚至是它们的一组 . 在很多应用程序中,我看到过这样的事情:
第一个存储库接口是一些通用基本接口,实际上只修复了第1点,但也将ID类型绑定为
Long
以保持一致性 . 第二个接口通常具有从CrudRepository
和PagingAndSortingRepository
复制的所有find…(…)
方法,但不公开操作的方法 . 在reference documentation中阅读有关该方法的更多信息 .摘要 - tl;博士
存储库抽象允许您选择完全由您的架构和功能需求驱动的基础存储库 . 如果它们适合,使用开箱即用的那些,必要时制作您自己的存储库基础接口 . 除非不可避免,否则请远离商店特定的存储库接口 .
Summary:
PagingAndSortingRepository扩展了CrudRepository
JpaRepository扩展了PagingAndSortingRepository
CrudRepository 接口提供了CRUD操作的方法,因此它允许您创建,读取,更新和删除记录,而无需定义自己的方法 .
PagingAndSortingRepository 提供了使用分页和排序检索实体的其他方法 .
最后, JpaRepository 添加了一些特定于JPA的功能 .
JpaRepository扩展PagingAndSortingRepository,后者又扩展CrudRepository .
他们的主要职能是:
CrudRepository主要提供CRUD功能 .
PagingAndSortingRepository提供了进行分页和排序记录的方法 .
JpaRepository提供了一些与JPA相关的方法,例如刷新持久性上下文和删除批处理中的记录 .
由于上面提到的继承,
JpaRepository
将具有CrudRepository
和PagingAndSortingRepository
的所有功能 . 因此,如果您不需要存储库具有JpaRepository
和PagingAndSortingRepository
提供的功能,请使用CrudRepository
.