1 问题描述
Spring Data JPA 中,CrudRepository 和 JpaRepository 有何区别?
当我在网上找例子的时候,发现它们可以互相替换使用。
它们有什么不同呢?为什么你习惯用其中的一个而不是另一个呢?
2 CrudRepository 和 JpaRepository 的具体区别
2.1 功能上的区别
JpaRepository 扩展了 PagingAndSortingRepository,而 PagingAndSortingRepository 又扩展了 CrudRepository。
它们的主要功能:
CrudRepository 主要提供 CRUD (增删改查)功能;
PagingAndSortingRepository 提供了执行分页和排序数据的方法;
JpaRepository 则提供了一些与 JPA 相关的方法,比如刷新持久性上下文和删除批处理中的记录;
而根据上面讲到的继承关系,JpaRepository 将拥有 PagingAndSortingRepository 和 CrudRepository 所提供的所有功能。因此,如果你不需要使用 PagingAndSortingRepository 和 JpaRepository 提供的额外功能,那么使用 CrudRepository 就足够了。
2.2 使用场景(用途)上的区别
回答 1 的说法完全正确,但我想针对你说的为什么习惯使用其中一个而并非另一个做出解释。
基础知识
一般,我们为存储库所选用的基本几口主要有两个用途。一个是允许 Spring JPA 存储库基础设施查找对应接口并触发代理创建,以便将接口实例注入到客户端。另外一个则是在不声明额外方法的情况下将所需功能尽可能地引入接口中。
通用接口
Spring Data 核心库提供了两个基本接口:
CrudRepository - CRUD (增删改查)方法;
PagingAndSortingRepository - 扩展 CrudRepository,主要是分页和排序方法;
特定存储接口
各个存储模块(如 JPA 或 MongoDB)公开了用于特定存储的扩展接口,以方便访问特定存储的功能,如刷新或专用的批处理操作。
我们一般不建议使用这些特定接口,因为它们向客户端暴露了底层持久化的接口,加强了它们和存储库之间的耦合。
自定义存储接口
依赖提供的通用接口存在两个主要缺点:
根据 Spring Data 数据接口的不同,存储库接口与存储库相耦合;
通过扩展 CrudRepository,就会立马暴露其中的持久化方法;
总结
存储库抽象允许我们自由选择完全由体系结构和功能需求所驱动的基础库。如果合适,我们可以使用开箱即用的方法。而如果有必要,我们也可以自己设计自己的存储接口。如非必要,尽量不要使用特定存储接口。
2.3 实现方法上的区别
总结:
JpaRepository 扩展了 PagingAndSortingRepository;
PagingAndSortingRepository 扩展了 CrudRepository;
CrudRepository 为接口提供了 CRUD 操作提供了方法,因此它允许创建、读取、更新和删除记录,而不用自己去定义方法;
PagingAndSortingRepository 提供了使用分页和排序检索实体的其他方法;