JPA和Spring Data JPA有什么区别?

183

我有点困惑于Spring Data-JPA和JPA之间的区别。我知道JPA是一种使用流行ORM技术将Java对象持久化到关系型数据库的规范。

换句话说,JPA提供接口和其他ORM技术,实现这些接口被称为JPA提供者,例如Hibernate。

那么,Spring Data JPA究竟是什么?

Spring Data JPA是否在JPA上增加了一些更多的功能(接口),并且仍然只是规范,还是它也是一个JPA提供者?

我看到Spring Data JPA围绕存储库(DAO层:如果我没有错的话)进行工作。所以,我的意思是,使用'Spring Data JPA + Hibernate'或仅直接使用'Hibernate'有何不同?

4个回答

145

我看到 Spring,JPA 工作于 repositories(DAO 层:如果我没记错的话)。所以我的意思是,使用“Spring JPA + Hibernate”和直接使用“Hibernate”有什么不同?

正如你所说,JPA 是一种规范,而 Hibernate 是该规范的一种具体实现(这些实现通常被称为 提供者)。通过使用 Hibernate,您将自己与该提供者绑定,限制了在需要时切换到另一选项的自由(例如,您希望使用 EclipseLink 或 ObjectDB 而不是 Hibernate,因为 Hibernate 存在会停止您的开发过程的错误)。

引用 Spring Data JPA 的文档:

实现应用程序的数据访问层已经很麻烦了。必须编写太多样板代码。域类是无生命力的,并没有以真正面向对象或领域驱动的方式进行设计。

同时使用这两种技术可使开发人员更轻松地处理丰富的域模型持久化。但是,尤其是实现存储库的大量样板代码仍然相当高。因此,Spring Data 的存储库抽象的目标是显着减少实现各种持久性存储的数据访问层所需的工作量。

总之,它在 JPA 之上添加了另一层抽象,类似于定义了一个基于标准的设计,以支持 Spring 上下文中的 持久化层。这些定义的接口(已知于 Spring)提供了框架处理使用 JPA 提供结果的服务。您可以按照 Spring 可以扫描项目并找到它的方式来定义存储库:

<repositories base-package="com.acme.repositories" />

因此,您可以在容器内或容器外使用它。

那么Spring和JPA到底是什么?Spring Data JPA是否在JPA上添加了更多功能(接口)并且它只是规范还是也是JPA提供者?

Spring Data JPA提供了一种实现存储库的定义,通过引用JPA规范并使用您定义的提供程序进行支持。


1
我可以把Repository称为Spring管理的实体集合吗?我不知道为什么,但是Spring JPA支持使用存储库似乎与EJB的EntityManager非常相似——这种想法正确吗,还是它们在目的上完全不同?预先感谢。谢谢。 - Asif
1
大多数解决方案都有共同点。虽然目标可能相同,但由于涉及的接口不同,实现方式也会有所不同。 - Fritz
1
我对“它在JPA之上”感到困惑,如果JPA是Hibernate实现的规范,那么这是否意味着Spring Data JPA是JPA的超集?就像TypeScript是JavaScript的超集一样? - Ghos3t

46
Java持久化API(有时称为JPA)是一个Java框架,使用Java平台标准版(JavaSE)和Java平台企业版(JavaEE)管理应用程序中的关系数据。在此上下文中,“持久性”涵盖了三个方面:

  • API本身,定义在javax.persistence包中。
  • Java持久化查询语言(JPQL)。
  • 对象关系元数据。enter image description here
Spring Data JPA是Spring Data项目的一部分,使实现基于JPA的存储库更容易。

特点:
  • 提供复杂的支持,以构建基于Spring和JPA的存储库
  • 支持QueryDSL谓词,从而实现类型安全的JPA查询
  • 透明审计领域类
  • 分页支持、动态查询执行、能够集成自定义数据访问代码
  • 在引导时验证@Query注释的查询
  • 支持基于XML的实体映射
  • 通过引入@EnableJpaRepositories实现基于JavaConfig的存储库配置

    enter image description here

43

JPA

JPA是一种规范,标准化了Java对象映射到关系型数据库系统的方式。作为一个规范,JPA由一组接口(如 EntityManagerFactory EntityManager )和注解组成,帮助您将Java实体对象映射到数据库表中。

有几个JPA提供程序可供选择,例如Hibernate、EclipseLink或Open JPA。

Spring Data JPA

Spring Data JPA是一个JPA数据访问抽象层。与JPA一样,Spring Data JPA也需要使用JPA提供程序。

Spring Data JPA提供了一个解决DDD Repository 模式 或者 DAO (Data Acess Object) 模式的方案。它还可以通过方法名约定代替您生成JPA查询。

Spring Data JPA可以与Hibernate、Eclipse Link或任何其他JPA提供程序配合使用。使用Spring或Java EE的一个非常有趣的好处是,您可以使用@Transactional注解声明性地控制事务边界。


0
Jpa是Java的规范,用于在Java对象和关系型数据库之间持久化数据。 Spring Data Jpa- 它与jpa相同,可以用以下方式描述。 Spring Data Jpa是jpa数据抽象访问,这意味着它类似于jpa,但它添加了一些额外的功能。如果没有jpa,我们无法实现Spring Data Jpa。

如果在这个解释之后还有任何疑问,请发表问题。 - 541-Rohit kumar

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