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