SpringData JPA、Hibernate JPA、JPA 之间的关系

jpa

JPA规范与ORM框架

JPA 规范本质上就是一种 ORM 规范,注意不是 ORM 框架——因为 JPA 并未提供 ORM 实现,它只是制订了一些规范,提供了一些编程的 API 接口,但具体实现则由服务厂商来提供实现,JBoss 应用服务器底层就以 Hibernate 作为 JPA 的实现。

既然 JPA 作为一种规范——也就说 JPA 规范中提供的只是一些接口,显然接口不能直接拿来使用。虽然应用程序可以面向接口编程,但 JPA 底层一定需要某种 JPA 实现,否则 JPA 依然无法使用。

Java 之所以提出 JPA 规范,其目的是以官方的身份来统一各种 ORM 框架的规范,包括著名的 Hibernate、TopLink 等。

不过 JPA 规范给开发者带来了福音:开发者面向 JPA 规范的接口,但底层的 JPA 实现可以任意切换:觉得 Hibernate 好的,可以选择 Hibernate JPA 实现;觉得 TopLink 好的,可以选择 TopLink JPA 实现……

这样开发者可以避免为使用 Hibernate 学习一套 ORM 框架,为使用 TopLink 又要再学习一套 ORM 框架。

下图是 JPA 和 Hibernate、TopLink 等 ORM 框架之间的关系:

JPA 和 Hibernate 的关系就像 JDBC 和 JDBC 驱动的关系,JPA 是规范,Hibernate 除了作为 ORM 框架之外,它也是一种 JPA 实现。JPA 怎么取代 Hibernate 呢?JDBC 可以驱动 JDBC 驱动吗?

Spring Data JPA与JPA规范

实现应用程序的数据访问层已经很麻烦了,好一阵子,太多的样板代码必须被写入。Domain classes,并没有被设计成面向一个真正的对象或领域驱动的方式。

使用 spring data jpa 能够使丰富的 Domain classes 的持久性开发变得轻松很多,即使样板代码来实现存储库量特别还是相当高的。所以 Spring data jpa 的目标是简化关于各种持久存储数据访问层而努力。

Domain classes 指的是 POJO 类,例如数据库中有一张表:Student,那么我们会在程序中定义与之对应的 Student.java,而这个 Student.java就是属于Domain classes。

Long story short, then, Spring Data JPA provides a definition to implement repositories that is supported under the hood by referencing the JPA specification, using the provider you define.

长话短说,Spring Data JPA 是在 JPA 规范的基础下提供了 Repository 层的实现,但是使用那一款 ORM 需要你自己去决定。

我的理解是:虽然 ORM 框架都实现了 JPA 规范,但是在不同 ORM 框架之间切换是需要编写的代码有一些差异,而通过使用 Spring Data JPA 能够方便大家在不同的 ORM 框架中间进行切换而不要更改代码。并且 Spring Data JPA 对 Repository 层封装的很好,可以省去不少的麻烦。

如果觉得这对你有用,请随意赞赏,给与作者支持
评论 0
最新评论