Spring Data(JPA)与JPA持久化提供程序有什么关系?

8

我正在努力理解JPA,并且已经学到了不少。JPA是一个Java规范,提供者实现了这个规范。我理解这一部分。

但我不明白的是Spring Data如何介入其中。Spring Data是否也像Hibernate或OpenJPA一样是一个提供者?如果不是,它是什么?Spring Data如何“让事情变得更容易”?


你在询问Spring Data JPA吗? - dhamibirendra
是的,这是Spring Data JPA:http://projects.spring.io/spring-data-jpa/ - user1099123
Spring Data JPA根据实体对象自动为您实现常见的JPA数据访问方法。它基于Grails对象关系映射(GORM)并使用相同的约定。自动生成的方法名称也描述了方法将返回的内容。如果您有一个具有属性bar的Foo对象,并且想要查找所有具有特定bar的Foos,只需调用自动生成的方法Foo.findByBar()。假设Foo具有一个dateCreated属性,并且您想要查找在某个时间范围内创建的所有Foos,请使用Foo.findByDateCreatedBetween(firstDate, secondDate)。 - Vance Cagle
Vance,所以它是一个提供者吗?我不需要使用OPENJPA或Hibernate吗?还是在实现这些方法时仍然需要提供者? - user1099123
3个回答

12
总的来说,Spring Data项目是一项总体任务的集合,其使命陈述如下:提供一个熟悉和一致的基于Spring的编程模型,同时保留存储特定的功能和能力。因此,我们在持久化领域中不仅通过JPA进行关系型数据访问。这里有两个重要方面:编程模型而非通用API,以及对存储特定功能的支持。Spring Data通过暴露存储特定功能的抽象,让Spring开发人员了解到这些。最顶层的编程模型是存储库抽象。它提供了CRUD功能、分页以及声明式查询方法,显著简化了数据访问层的开发。为一个Customer领域类启用持久性只需要声明一个存储库接口即可。
interface CustomerRepository extends PagingAndSortingRepository<Customer, Long> {

  List<Customer> findByLastnameContaining(String lastname);
}
现在只需要进行配置(以及域类映射),就可以创建此接口的实例并从客户端使用它。PagingAndSortingRepository包括基本的CRUD功能,以及像Page<Customer> findAll(Pageable pageable)(分页访问)这样的东西。如您所见,我们还支持查询派生机制,以避免为简单查询编写任何实现代码。对于更复杂的查询,我们允许手动声明(例如在方法中使用@Query)或者甚至手动实现,如果必要的话。
一个很好的副作用是,在配置的转换开关下,您可以使用同一仓库接口将Customer实例存储到MongoDB中。这并不意味着我们建议盲目地从一个存储切换到另一个存储,因为存储通常需要调整数据模型以有效地工作。但是,它允许开发人员在使用不同存储的项目之间快速切换,因为仓库只是以相同的方式工作(通过共同API方法实现编程模型的方式)。
JPA特定内容
Spring Data JPA实际上是一个薄层,实现了仓库抽象以及其他一些小玩意。因此,我们并没有替换持久性提供程序,而是通过API利用它们,甚至缓解了各个JPA提供程序之间的某些怪癖和差异。

详细的回答,但它并没有回答根本问题:“Spring Data JPA是一个提供者,还是JPA上面的一层,仍然需要底层的提供者(OpenJPA、Hibernate、EclipseLink等)?” - Jim Garrison
此答案过长,缺乏具体细节。 - Abhinav Manchanda

2

将Spring Data视为一种支持JPA和许多其他持久性模型的方式,这种方式对您自己的代码是透明的。Spring Data使您更容易地在统一接口中操作更多类型的数据源系统。如果没有Spring Data,则每次处理额外逻辑时,您需要在代码中引入更多适配器。


2

spring-data JPA不是JPA提供程序。它是一个库/框架,为我们的JPA提供程序(Hibernate/TopLink)添加了一个额外的抽象层。如果您在项目中使用Spring Data,则不需要编写大部分低级别数据访问操作,如编写SQL查询、DAO类等。

但是,您必须拥有一个JPA提供程序(Hibernate、Toplink等)才能实现spring-data-jpa。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接