Spring Data JPA中的代码仓库和jpareposaku接口有什么区别?
当我在网上看到这些例子时,我看到它们在那里可以互换使用。
它们之间有什么区别?
你为什么要使用一个而不是另一个?
JpaRepository延伸PagingAndSortingRepository,反过来延伸CrudRepository。
JpaRepository
PagingAndSortingRepository
CrudRepository
它们的主要职能是:
由于上面提到的继承,JpaRepository将拥有CrudRepository和PagingAndSortingRepository的所有功能。因此,如果您不需要存储库来拥有JpaRepository和PagingAndSortingRepository提供的功能,请使用CrudRepository。
肯的答案基本上是正确的,但我想加入“为什么你想使用一个而不是另一个?”你问题的一部分。
您为存储库选择的基本接口有两个主要目的。首先,您允许Spring Data存储库基础设施找到您的接口并触发代理创建,以便您将接口实例注入客户端。第二个目的是在接口中引入所需的尽可能多的功能,而无需声明额外的方法。
Spring Data核心库附带了两个基本接口,公开了一组专用的功能:
单独的store模块(例如用于JPA或MongoDB)公开了这些基本接口的特定于商店的扩展,以允许访问特定于商店的功能,例如刷新或考虑一些商店细节的专用批处理。一个例子是deleteInBatch(…) ofJpaRepository,它与delete(…)不同,因为它使用查询来删除给定的实体,这更高性能,但附带的副作用是不触发JPA定义的级联(正如规范定义的那样)。
deleteInBatch(…)
delete(…)
我们通常建议没有使用这些基本接口,因为它们向客户端公开了底层持久性技术,从而加强了它们与存储库之间的耦合。另外,你有点偏离存储库的原始定义,基本上是“实体的集合”。所以如果可以,请使用PagingAndSortingRepository。
直接依赖于提供的基本接口之一的缺点是双重的。它们都可能被认为是理论上的,但我认为它们很重要,需要注意:
Page
Pageable
save(…)
ReadOnlyRepository
这两个缺点的解决方案是制作自己的基本存储库接口,甚至是一组。在很多应用程序中,我见过这样的东西:
interface ApplicationRepository<T> extends PagingAndSortingRepository<T, Long> { } interface ReadOnlyRepository<T> extends Repository<T, Long> { // Al finder methods go here}
第一个存储库接口是一些通用的基本接口,实际上只修复了第1点,但为了一致性还将ID类型绑定为Long。第二个接口通常包含从CrudRepository和PagingAndSortingRepository复制的所有find…(…)方法,但不公开操纵方法。在参考留档中阅读有关该方法的更多信息。
Long
find…(…)
存储库抽象允许您选择完全由您的架构和功能需求驱动的基本存储库。如果适合,请使用开箱即用的存储库,必要时制作自己的存储库基本接口。除非不可避免,否则远离存储特定的存储库接口。
总结:
PagingAndSorting Repostory扩展CrudRepostory
JpaReposential扩展PagingAndSorting Reposential
代码仓库接口提供了CRUD操作的方法,因此它允许您创建、读取、更新和删除记录,而无需定义自己的方法。
分页和排序存储库提供了使用分页和排序检索实体的附加方法。
最后,jpareposaku添加了一些特定于JPA的功能。
我正在学习Spring Data JPA。它可能会帮助你:
所有答案都对问题提供了足够的细节。然而,让我再补充一点。
我们为什么要使用这些接口:
哪个接口做什么:
什么时候用哪个接口:
根据http://jtuts.com/2014/08/26/difference-between-crudrepository-and-jparepository-in-spring-data-jpa/
一般来说,最好的主意是使用代码仓库或分页和排序存储库,具体取决于您是否需要排序和分页。
如果可能,应该避免jpareposaku,因为它将您的存储库与JPA持久性技术联系起来,并且在大多数情况下,您甚至可能不会使用它提供的额外方法。
以下是CrudRepository和JpaRepository之间的区别:
Repository
saveAll()
Iterable
flush()
saveAndFlush()
deleteInBatch()
List
Crud存储库是基础接口,它充当标记接口。
JPA存储库还扩展了PagingAndSorting存储库。它提供了所有对实现分页有用的方法。Crud Repostory不提供实现分页和排序的方法
您可以参考-https://www.tutorialspoint.com/difference-between-crudrepository-and-jparepository-in-java#:~: text=Crud%20Repostory%20is%20the%20base,行为%20as%20a%20标记%20接口。&text=JPA%20repostory%20也%20延伸%20the,用于%20实现%20分页%20and%20排序。
spring-data-jpa 3.x
spring-data-jpa 3.x与spring-boot 3.x和spring-core 6.x一起使用,
spring-boot 3.x
spring-core 6.x
结构和等级制度已经修改,似乎更加明确。
ListCrudRepository扩展CrudRepository
ListCrudRepository
ListPagingAndSortingRepository扩展PagingAndSortingRepository
ListPagingAndSortingRepository
JpaRepository扩展了ListCrudRepository、ListPagingAndSortingRepository。
所以基本上ListPagingAndSortingRepository、ListCrudRepository的新引入接口现在代表了旧接口的功能,但返回类型为List<T>,而其余PagingAndSortingRepository、CrudRepository处理Iterable<T>的返回类型
List<T>
Iterable<T>
在新的(3. x)版本中,结构如下:
在过去(3.0之前),许多返回List<T>的声明方法都直接在JpaRepository中声明,但现在这些方法有了单独的接口,它们被提取到ListPagingAndSortingRepository、ListCrudRepository中。
所以(3. x)之前的结构是
我希望从上述模式中可以清楚地看出,在3.x版本中,所提到的JpaRepository和CrudRepository是如何被修改的。
3.x
如果您计划将2.x1从2.x迁移到3.x(如果您从2.x2迁移到2.x3,这是必要的),如上述模式所示,您应该期望在代码中使用PagingAndSortingRepository的情况下会有破坏代码,因为过去它是从CrudRepository扩展的,因此您的自定义存储库直接扩展了PagingAndSortingRepository已经可以访问CrudRepository的方法。如果这是问题,您应该通过调整您的自定义存储库以扩展ListCrudRepository或CrudRepository来解决此问题。
2.x