Hibernate 和 JPA 到底什么关系?一文讲清规范与实现的区别
本文已收录在Github,关注我,紧跟本系列专栏文章,咱们下篇再续!
- 🚀 魔都架构师 | 全网30W技术追随者
- 🔧 大厂分布式系统/数据中台实战专家
- 🏆 主导交易系统百万级流量调优 & 车联网平台架构
- 🧠 AIGC应用开发先行者 | 区块链落地实践者
- 🌍 以技术驱动创新,我们的征途是改变世界!
- 👉 实战干货:编程严选网
0 前言
很多人说:hibernate 就是 JPA 接口的具体实现框架吗?
的确,Hibernate 是 JPA 规范的一个实现(而且是官方认可的"参考实现")。但"就是"二字不准确。
1 JPA 是规范/接口,不是框架
JPA(Java Persistence API,现 Jakarta Persistence), JCP 制定的一套规范(标准),只定义了抽象接口、注解和 API(如 EntityManager、EntityTransaction、@Entity、@Id、@Table、Query、Criteria 等),它本身不干活,无任何具体实现。
所以JPA 定义"做什么"(标准契约),而 Hibernate 负责"怎么做"(落地实现)。
2 "就是"的错
2.1 JPA的实现不止 Hibernate
JPA 有多个实现/provider,Hibernate 只是其中之一(虽是最流行、Spring Boot 默认用的):
| JPA Provider | 说明 |
|---|---|
| Hibernate | 事实上的主流,官方参考实现之一 |
| EclipseLink | 参考实现,Eclipse 基金会维护(Oracle TopLink 的前身) |
| OpenJPA | Apache 旗下 |
| DataNucleus | JDO + JPA 双重规范实现 |
Spring Boot 中你写 spring-boot-starter-data-jpa,底层默认装配的就是 Hibernate——但只要你换依赖,同样可以换用 EclipseLink,业务代码(@Entity、JpaRepository)基本不用改,这正是"面向接口规范"的好处。
2.2 Hibernate 的功能远超 JPA 规范
Hibernate 比 JPA 出现得更早(JPA 规范早期就是从 Hibernate 作者 Gavin King 参与的 EJB 实体 Bean 改进中演化来的)。Hibernate 是"自带完整身家"的:
① 有自己的原生 API
Session、SessionFactory、Criteria 等(JPA 对应的是 EntityManager/EntityManagerFactory);
② 有一堆 JPA 规范之外的功能
如 @BatchSize、@OptimisticLocking、@Formula、@DynamicUpdate、@Fetch、二级缓存等。
③ hibernate.cfg.xml
HQL、reverse engineering 这些也是 Hibernate 独有的。
所以更完整的说法是:Hibernate 是一个独立的 ORM 框架,同时它实现了 JPA 规范——当你只用 JPA 标准的注解和 EntityManager/JpaRepository 接口时,它就是在扮演"JPA 的实现";但你能用的能力绝不限于 JPA 那部分。
3 总结
JPA(规范 / 接口,只管定义)
▲
│ 实现(面向接口编程)
│
┌─────────┼──────────┐
Hibernate EclipseLink OpenJPA ...
(参考实现,主流)
所以说"Hibernate 是 JPA 接口的具体实现框架之一"是准确的;但"Hibernate 就是(=唯一=)JPA 的实现"就不对了——反向来说,Hibernate 也不只是 JPA 的实现,它本身的原生能力比 JPA 规范更大。
Spring Boot + Spring Data JPA 里,你操作的是 JpaRepository(这也是一个接口,Spring Data 会基于 Hibernate 作为 provider 帮你动态生成实现类),这恰恰体现了"面向接口/规范编程"——框架层通过接口把你和具体 ORM 解耦开来。

浙公网安备 33010602011771号