Java持久化API

**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 （頁面存檔備份，存於網際網路檔案館）

## 參考文獻

## 外部連結

### 一般信息

* 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（頁面存檔備份，存於網際網路檔案館）