Spring Data JPA中CrudRepository
和JpaRepository
接口有什么区别?
当我在网上看到这些例子时,我看到它们在那里可以互换使用。他们之间有什么区别?你为什么要用另一个呢?
答案 0 :(得分:701)
JpaRepository
扩展PagingAndSortingRepository
,后者又扩展CrudRepository
。
他们的主要职能是:
CrudRepository
主要提供CRUD功能。PagingAndSortingRepository
提供了分页和排序记录的方法。JpaRepository
提供了一些与JPA相关的方法,例如刷新持久化上下文和批量删除记录。由于上述继承,JpaRepository
将具有CrudRepository
和PagingAndSortingRepository
的所有功能。因此,如果您不需要存储库具有JpaRepository
和PagingAndSortingRepository
提供的功能,请使用CrudRepository
。
答案 1 :(得分:341)
肯的答案基本上是正确的,但我想谈谈“你为什么要用一个而不是另一个?”你的问题的一部分。
您为存储库选择的基本接口有两个主要用途。首先,您允许Spring Data存储库基础结构找到您的接口并触发代理创建,以便将接口实例注入客户端。第二个目的是在界面中引入尽可能多的功能,而不必声明额外的方法。
Spring Data核心库附带两个基本接口,可以显示一组专用的功能:
CrudRepository
- CRUD方法PagingAndSortingRepository
- 分页和排序方法(扩展CrudRepository
)单个商店模块(例如,用于JPA或MongoDB)公开这些基本接口的特定于商店的扩展,以允许访问特定于商店的功能,例如刷新或专用批处理,其中考虑了一些商店细节。这方面的一个例子是deleteInBatch(…)
JpaRepository
与delete(…)
不同,因为它使用查询删除给定的实体,这些实体性能更高但带有不触发JPA的副作用-defined cascades(如规范定义的那样)。
我们通常建议不使用这些基本接口,因为它们将底层持久性技术暴露给客户端,从而加强它们与存储库之间的耦合。另外,您从存储库的原始定义中获得了一点点,该存储库基本上是“实体集合”。如果可以的话,请留下PagingAndSortingRepository
。
直接依赖于其中一个提供的基础接口的缺点是双重的。它们都可能被认为是理论上的,但我认为重要的是要注意:
Page
或{之类的抽象。无论如何,在您的代码中{1}}。 Spring Data与commons-lang或Guava等任何其他通用库没有任何不同。只要它提供合理的利益,就可以了。Pageable
,你会立即公开一套完整的持久性方法。这在大多数情况下都可能很好但是你可能会遇到你想要获得更细粒度控制的情况。方法暴露,例如创建不包含CrudRepository
的{{1}}和ReadOnlyRepository
方法的save(…)
。这两个缺点的解决方案是制作您自己的基础存储库接口甚至是一组它们。在很多应用程序中,我看到过类似的东西:
delete(…)
第一个存储库接口是一些通用基本接口,它实际上只修复了第1点,但也将ID类型绑定为CrudRepository
以保持一致性。第二个界面通常包含从interface ApplicationRepository<T> extends PagingAndSortingRepository<T, Long> { }
interface ReadOnlyRepository<T> extends Repository<T, Long> {
// Al finder methods go here
}
和Long
复制的所有find…(…)
方法,但不会公开操纵的方法。在reference documentation中了解有关该方法的更多信息。
存储库抽象允许您选择完全由您的架构和功能需求驱动的基础存储库。如果它们适合,使用开箱即用的那些,必要时制作您自己的存储库基础接口。除非不可避免,否则请远离商店特定的存储库接口。
答案 2 :(得分:50)
<强>要点:强>
PagingAndSortingRepository扩展了CrudRepository
JpaRepository扩展了PagingAndSortingRepository
CrudRepository 接口提供了CRUD操作的方法,因此它允许您创建,读取,更新和删除记录,而无需定义自己的方法。
PagingAndSortingRepository 提供了使用分页和排序检索实体的其他方法。
最后 JpaRepository 添加了一些特定于JPA的功能。
答案 3 :(得分:8)
以下是CrudRepository
和JpaRepository
之间的区别,如下:
CrudRepository
CrudRepository
是基本接口,并且扩展了Repository
接口。CrudRepository
主要提供CRUD(创建,读取,更新,删除)操作。saveAll()
方法的返回类型为Iterable
。CrudRepository
的存储库。JpaRepository
JpaRepository
扩展了PagingAndSortingRepository
,扩展了CrudRepository
。JpaRepository
提供CRUD和分页操作,以及flush()
,saveAndFlush()
和deleteInBatch()
等附加方法。saveAll()
方法的返回类型为List
。JpaRepository
。答案 4 :(得分:4)
所有答案都为问题提供了足够的细节。但是,让我添加更多内容。
我们为什么要使用这些界面:
哪个界面可以执行以下操作:
何时使用哪个界面:
根据http://jtuts.com/2014/08/26/difference-between-crudrepository-and-jparepository-in-spring-data-jpa/
通常最好的方法是使用 CrudRepository 或 PagingAndSortingRepository ,具体取决于您是否需要排序和分页。
尽可能避免使用 JpaRepository ,因为它将您的存储库与JPA持久性技术联系在一起,在大多数情况下,您甚至可能不会使用它提供的额外方法。
答案 5 :(得分:2)
简而言之,
PagingAndSortingRepository 扩展了 CrudRepository 和
JpaRepository 扩展了 PagingAndSortingRepository
在使用Spring Data JPA 时,您应该了解三个重要的存储库接口:
index
而不是{{1} } 所有这些存储库接口直接或间接扩展了顶级Spring Data 存储库接口。
答案 6 :(得分:0)