Spring Data JPA中的CrudRepository和JpaRepository接口有什么区别?
Spring Data JPA中的CrudRepository
和JpaRepository
接口有何不同,请参阅Web中的示例。 我看到他们在那里交换使用的一种。 他们有什么区别? 你为什么要用另一个呢?
JpaRepository扩展了PagingAndSortingRepository ,后者又扩展了CrudRepository 。
他们的主要function是:
- CrudRepository主要提供CRUDfunction。
- PagingAndSortingRepository提供了分页和sortinglogging的方法。
- JpaRepository提供了一些与JPA相关的方法,比如刷新持久化上下文和批量删除logging。
由于上面提到的inheritance, JpaRepository
将具有CrudRepository
和PagingAndSortingRepository
所有function。 因此,如果您不需要存储库具有JpaRepository
和PagingAndSortingRepository
提供的function,请使用CrudRepository
。
肯的答案基本上是正确的,但我想在“你为什么要使用一个呢? 你的问题的一部分。
基本
您为存储库select的基本接口有两个主要目的。 首先,您允许Spring Data存储库基础结构find您的接口并触发代理创build,以便将接口的实例注入到客户端。 第二个目的是在接口中引入尽可能多的function,而不必声明额外的方法。
通用接口
Spring Data核心库附带两个基本接口,提供一组专用function:
-
CrudRepository
– CRUD方法 -
PagingAndSortingRepository
– 分页和sorting的方法(扩展CrudRepository
)
商店特定的接口
各个商店模块(例如JPA或MongoDB)公开这些基本接口的存储特定扩展,以允许访问特定于商店的function,例如冲洗或专用批处理,这些function考虑了一些存储细节。 一个例子是deleteInBatch(…)
,它不同于delete(…)
因为它使用查询来删除给定的实体,这是更高性能的,但带有不触发JPA定义级联的副作用(如spec定义它)。
我们通常build议不要使用这些基本接口,因为它们将底层持久性技术暴露给客户端,从而加强了它们与存储库之间的耦合。 此外,您还可以从基本上是“实体集合”的存储库的原始定义中获得一些信息。 所以如果可以的话,留在PagingAndSortingRepository
。
定制存储库基础接口
直接取决于提供的基本接口之一的缺点是双重的。 他们两个都可能被认为是理论性的,但我认为他们很重要的是要知道:
- 取决于Spring数据存储库接口将您的存储库接口连接到库。 我不认为这是一个特定的问题,因为您可能会在代码中使用像
Page
或Pageable
这样的抽象。 Spring Data与commons-lang或Guava等其他通用库没有任何区别。 只要它提供合理的利益,就好了。 - 通过扩展例如
CrudRepository
,你一次公开了一套完整的持久化方法。 在大多数情况下,这可能是好的,但是你可能会遇到你想要更好的控制方法公开的情况,比如创build一个ReadOnlyRepository
,它不包含save(…)
和delete(…)
方法的CrudRepository
。
解决这两个缺点的方法是创build自己的基本存储库接口,甚至是一组接口。 在很多应用程序中,我们已经看到类似这样的东西:
interface ApplicationRepository<T> extends PagingAndSortingRepository<T, Long> { } interface ReadOnlyRepository<T> extends Repository<T, Long> { // Al finder methods go here }
第一个存储库接口是一些通用的基本接口,实际上它只固定点1,而且为了一致性绑定IDtypes为Long
。 第二个接口通常包含从CrudRepository
和PagingAndSortingRepository
复制的所有find…(…)
方法,但不公开操作的方法。 阅读参考文档中有关该方法的更多信息 。
总结 – tl; dr
存储库抽象允许您挑选完全由您的架构和function需求驱动的基本存储库。 如果他们适合,使用现成的盒子,如果需要的话,制作自己的仓库基础接口。 远离商店特定的存储库接口,除非不可避免。