**Java 持久化 API** (**JPA**)是一个 Java 应用程序接口 规范，描述了使用 Java标准版平台（Java SE） 和 Java企业版平台（Java EE）的应用中的 关系数据 的管理。

持久化，在这里包括三个层面的意思：

* API 本身，定意在 javax.persistence 包内
* Java持久化查询语言 (JPQL)
* 对象/关系 元数据

JPA 的 参考实现 是 EclipseLink（英语：）。

历史背景
----

2006年5月11号，JPA 1.0 规范作为 JCP JSR 220 的一部分最终被发布。JPA 2.0 规范，在2009年12月发布（Java EE 6 平台，依赖于 JPA 2.0。） JPA 2.1 规范，在2013年4月22日发布（Java EE 7 平台，依赖于 JPA 2.1。）

实体
--

持久化实体是一个轻量级的 Java 类，其状态通常持久地保存到关系数据库的表中。 这种实体的实例对应于表中的各个行。 实体之间通常有关系，这些关系通过对象/关系元数据表示。 可以在实体类文件中直接使用注释来指定这种关系，也可以在随应用程式分发的单独XML描述文件中指定。

Java 持久化查询语言（JPQL）
------------------

Java持久化查询语言 （JPQL）对存储在关系数据库中的实体进行查询。查询在语法上类似于SQL查询，但是操作的是实体对象而不是直接对数据库表进行操作。

动机
--

在引入EJB 3.0规范之前，许多企业级Java开发人员使用由持久化框架（例如Hibernate）或数据访问对象（DAO）提供的轻量级持久化对象，来代替实体bean（EJB的一种）。 这是因为在以前的EJB规范中，实体bean需要太多复杂的代码和繁重的资源占用，并且由于bean和DAO对象或持久化框架之间的源代码中的互连和依赖性，它们只能在Java EE应用程式服务器中使用。 因此，最初在第三方持久性框架中提供的许多功能都被合并到Java Persistence API中，并且从2006年开始，像Hibernate（版本3.2）和TopLink Essentials这样的项目已经实现Java Persistence API规范。

相关技术
----

### 企业 JavaBeans（EJB）

EJB 3.0规范（本身是Java EE 5平台的一部分）包含Java 持久化 API的定义。 无论如何，终端用户不需要EJB容器或Java EE应用程式服务器即可运行使用此持久性API的应用程式。 Java 持久化 API的未来版本将在单独的JSR和规范中定义，而不是在EJB JSR /规范中定义。

Java 持久化 API取代了EJB 2.0 CMP（持久化管理容器）的持久性解决方案

### Java数据对象的API

Java 持久化 API作为统一Java Data Objects API和EJB 2.0容器管理持久性（CMP）API的一部分来开发。截至2009年，支持这些API的大多数产品都支持Java 持久化 API。

Java 持久化 API仅为关系数据库管理系统提供持久化特性。也就是说，JPA专注于对象关系映射（ORM）（请注意，除了关系数据库之外，还有JPA提供程式支持其他数据库模型，但这超出了JPA的设计范围）。有关JPA角色的说明，请参阅JPA 2规范第1节简介，其中非常清楚地说明"这项工作的技术目标是为Java应用程式开发人员提供一个对象/关系映射工具，使用Java领域模型来管理关系数据库。"

Java 数据对象规范支持ORM，以及对其他类型的数据库模型的持久化，例如平面文件数据库和NoSQL数据库，包括文档数据库，图形数据库，以及字面上任何其他可想到的数据存储。

### 服务数据对象 API

Java 持久化 API的设计者旨在提供关系持久化，其中许多关键领域来自对象关系映射工具，如Hibernate和TopLink。Java 持久化 API改进并取代了EJB 2.0，其体现在EJB 3.0中。服务数据对象（SDO）API（JSR 235）与Java 持久化 API有着截然不同的目标，被认为是互补的。 SDO API专为面向服务的体系结构，多种数据格式而非关系数据和多种编程语言而设计。JCP 管理SDO API的Java版本; SDO API的C ++版本通过OASIS进行管理。

### Hibernate

Hibernate为Java提供了一个开源的对象关系映射框架。版本3.2及更高版本提供了Java 持久化 API的实现。Gavin King创立了Hibernate项目。他代表JBoss参加JSR 220，这是负责开发JPA的JCP专家组。这引发了围绕JPA和Hibernate之间关系的持续争议和猜测。Sun Microsystems表示，这些想法来自几个框架，包括Hibernate和Java 数据对象。

### Spring Data JPA

抽象存储库的实现是Java应用程式框架Spring的领域驱动设计的关键构建块。透明地支持所有可用的JPA实现，并支持CRUD操作以及方便地执行数据库查询。

JPA 2.0
-------

2007年7月，JPA 2.0 在JCP的JSR 317请求中作为新版本开发。2009年12月10日，JPA 2.0被批准为最终正式标准。JPA 2.0的重点是提供一些流行的ORM供应商中存在的特性，但在JPA 1.0中不能获得一致认可。

主要特性包括：

* 扩大对象关系功能的映射
	+ 支持内嵌对象的收集，通过多对一的关系映射来连接ORM
	+ 有序列表
	+ 访问类型的组合
* 一种标准查询API
* 标准化的 SQL提示
* 标准化的附加元数据，以支持DDL生成
* 支持验证
* 支持共享对象的高速缓存。

支持 JPA 2.0 的供应商:

* Batoo JPA
* DataNucleus (formerly JPOX)
* EclipseLink (formerly Oracle TopLink)
* IBM, for WebSphere Application Server
* JBoss with Hibernate
* Kundera （页面存档备份，存于）
* ObjectDB
* OpenJPA
* OrientDB from Orient Technologies
* Versant Corporation JPA (not relational, object database)

JPA 2.1
-------

2011年7月，JPA 2.1 在JCP的JSR 338请求中作为新版本开发。2013年5月22日，JPA 2.1被批准为最终正式标准。

主要特性包括：

* 转换器-允许自定义的代码去装换不同的数据库和数据类型。
* 标准Update/Delete-允许通过标准API批量更新和删除。
* 实体图表-允许获取部分或合并对象。
* JPQL/标准增强-算子查询，通用数据库的功能，Join 联合查询，TREAT 选项。
* 模式生成
* 存储过程，允许查询被定义为数据库的存储过程。

支持 JPA 2.1 的供应商:

* DataNucleus
* EclipseLink
* Hibernate

JPA 2.2
-------

2017年，JPA 2.2 在JCP的JSR 338请求中作为维护版本发布开发。维护审查已于2017年6月19日获得批准。

主要特性包括：

* 给所有有关的注释添加 @Repeatable
* 允许所有 JPA 注释可用于元的注释。
* 添加查询结果流处理能力
* 允许AttributeConverters 的 CDI 注入
* 支持Java8日期和时间类型

支持 JPA 2.2 的供应商:

* DataNucleus
* EclipseLink (from version 2.7)
* Hibernate (from version 5.3)

JPA 未来工作
--------

未来的JPA规范信息可在此处获得：

* JPA Specification Mailing Lists
* JPA Specification JIRA

2015年11月，Linda DeMichiel在javaee-spec用户邮件中宣布Lukas Jungmann接任规范化主管。Linda的声明还表示，"计划在Java EE 8时间框架内为JPA 2.2做MR"。

工具
--

* NetBeans Jeddict
* Eclipse JPA (Dali)

参见
--

* .NET Persistence API (NPA)
* JDBC
* MyBatis
* OpenXava
* pureQuery
* SAP NetWeaver Application Server
* XQJ
* ObjectiveSql （页面存档备份，存于）

参考文献
----

1. ↑ . Oracle.  [2018-07-29]. （原始内容存档于2018-10-02）.
2. ↑  Hibernate EntityManager: Java SE environments （页面存档备份，存于）  
Hibernate EntityManager: Obtaining an EntityManager in a Java SE environment （页面存档备份，存于）
3. ↑  Barreto, Charlton.. Digital Walkabout.  [5 May 2011]. （原始内容存档于2011-08-13）.
4. ↑  Edwards, Mike.. Open SOA. osoa.org.  [5 May 2011]. （原始内容存档于2011-09-29）.
5. ↑ . Manning Publications.  [8 December 2013]. ISBN 9781617290459. （原始内容存档于2019-06-05）. Gavin King is the founder of the Hibernate project
6. ↑ . JBoss.  [2008-11-17]. （原始内容存档于2012-10-01）. JSR 220, EJB 3.0 Spec Committee, Gavin King, Bill Burke, Marc Fleury
7. ↑ . Sun Microsystems.  [2010-07-01]. （原始内容存档于2008-08-22）. The Java Persistence API draws upon the best ideas from persistence technologies such as Hibernate, TopLink, and JDO
8. ↑ . Download web site. IBM. 27 April 2010  [8 December 2013]. （原始内容存档于2019-06-10）.
9. ↑ . Download web site. Actian.  [8 December 2013]. （原始内容存档于2013-12-08）.
10. ↑ .  [2016-11-08]. （原始内容存档于2016-11-09）.
11. ↑  Java, 2015-10-27  [2016-11-08], （原始内容存档于2019-02-16）
12. ↑  Jungmann, Lukas.. JavaOne 2015 Session Catalog. 10 October 2015  [2016-11-08]. （原始内容存档于2016-11-09） –rainfocus.com.

外部链接
----

### 一般信息

* Documentation for the final version of the EJB3 spec (called JSR220) （页面存档备份，存于）
* GlassFish's Persistence pageArchive.is的存檔，存档日期2013-01-12
* JCP Persistence page （页面存档备份，存于）

### 教程

* Java EE 6 Persistence API Javadoc（页面存档备份，存于）
* Java EE 6 Persistence API tutorial （页面存档备份，存于）
* Java EE 7 Persistence API Javadoc （页面存档备份，存于）
* Java EE 7 Persistence API tutorial （页面存档备份，存于）
* JPA Tutorial by Prasad Kharkar （页面存档备份，存于）
* JPA Tutorial from Java Code Geeks （页面存档备份，存于）
* JPA Tutorial using OpenJPA as implementation （页面存档备份，存于）
* Persistence in the Java EE 5 tutorial（页面存档备份，存于）