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

Spring Data JPA中的CrudRepositoryJpaRepository接口有何不同,请参阅Web中的示例。 我看到他们在那里交换使用的一种。 他们有什么区别? 你为什么要用另一个呢?

JpaRepository扩展了PagingAndSortingRepository ,后者又扩展了CrudRepository 。

他们的主要function是:

  • CrudRepository主要提供CRUDfunction。
  • PagingAndSortingRepository提供了分页和sortinglogging的方法。
  • JpaRepository提供了一些与JPA相关的方法,比如刷新持久化上下文和批量删除logging。

由于上面提到的inheritance, JpaRepository将具有CrudRepositoryPagingAndSortingRepository所有function。 因此,如果您不需要存储库具有JpaRepositoryPagingAndSortingRepository提供的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

定制存储库基础接口

直接取决于提供的基本接口之一的缺点是双重的。 他们两个都可能被认为是理论性的,但我认为他们很重要的是要知道:

  1. 取决于Spring数据存储库接口将您的存储库接口连接到库。 我不认为这是一个特定的问题,因为您可能会在代码中使用像PagePageable这样的抽象。 Spring Data与commons-lang或Guava等其他通用库没有任何区别。 只要它提供合理的利益,就好了。
  2. 通过扩展例如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 。 第二个接口通常包含从CrudRepositoryPagingAndSortingRepository复制的所有find…(…)方法,但不公开操作的方法。 阅读参考文档中有关该方法的更多信息 。

总结 – tl; dr

存储库抽象允许您挑选完全由您的架构和function需求驱动的基本存储库。 如果他们适合,使用现成的盒子,如果需要的话,制作自己的仓库基础接口。 远离商店特定的存储库接口,除非不可避免。