JPA(Java Persistence API) 是 SUN 公司推出的一套 ORM 規范,充當 Java 物件和關系資料庫系統之間的橋梁;本文主要介紹其基本概念,
1、JPA 發展歷史
JPA 1.0:于 2006 年發布
JPA 2.0:于 2009 年末發布
JPA 2.1:于 2013 年發布,它有如下重要特性:
1、Named Stored Procedure Query
2、Stored Procedure Query
3、Attribute Converter
4、Constructor Result Mapping
5、Programmatic Named Queries
6、Named Entity Graph
7、Entity Graph
8、JPQL Enhancements
9、Criteria API Bulk Operations
10、Unsynchronized Persistence Context
11、Generating DB Schema
12、CDI-Support in Entity Listener
詳細說明可查看:https://thorben-janssen.com/jpa-21-overview/
JPA 2.2:于 2017 年發布,它有如下重要特性:
1、Stream query results
2、Make annotations @Repeatable
3、Support Java 8 Date and Time API
4、Support CDI Injection in AttributeConverters
5、Change Persistence Provider Discovery Mechanism for Java 9 Modules
6、Summary
詳細說明可查看:https://thorben-janssen.com/whats-new-in-jpa-2-2
JPA 3.0:與 2020 年發布,它有如下變化:
1、包名修改,從 javax.persistence.* 修改為 jakarta.persistence.*
2、組態檔命名空間修改,從 http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd 改為 https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd
2、JPA 提供商
JPA 只是一個規范,定義了一些介面,沒有提供實作;提供實作 JPA 規范的產品有:
Hibernate、EclipseLink、OpenJPA 等,
3、JPA 的優點
標準化
JPA 是 JCP 組織發布的 Java EE 標準之一,因此任何聲稱符合 JPA 標準的框架都遵循同樣的架構,提供相同的訪問API,這保證了基于 JPA 開發的企業應用能夠經過少量的修改就能夠在不同的 JPA 框架下運行,
容器級特性的支持
JPA 框架中支持大資料集、事務、并發等容器級事務,這使得 JPA 超越了簡單持久化框架的局限,在企業應用發揮更大的作用,
簡單方便
JPA 的主要目標之一就是提供更加簡單的編程模型:在 JPA 框架下創建物體和創建 Java 類一樣簡單,沒有任何的約束和限制,只需要使用 javax.persistence.Entity 進行注釋,JPA 的框架和介面也都非常簡單,沒有太多特別的規則和設計模式的要求,開發者可以很容易地掌握,JPA 基于非侵入式原則設計,因此可以很容易地和其它框架或者容器集成,
查詢能力
JPA 的查詢語言是面向物件而非面向資料庫的,它以面向物件的自然語法構造查詢陳述句,可以看成是 Hibernate HQL 的等價物,JPA 定義了獨特的 JPQL(Java Persistence Query Language),JPQL 是 EJB QL 的一種擴展,它是針對物體的一種查詢語言,操作物件是物體,而不是關系資料庫的表,而且能夠支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能夠提供的高級查詢特性,甚至還能夠支持子查詢,
高級特性
JPA 中能夠支持面向物件的高級特性,如類之間的繼承、多型和類之間的復雜關系,這樣的支持能夠讓開發者最大限度的使用面向物件的模型設計企業應用,而不需要自行處理這些特性在關系資料庫的持久化,
4、JPA 類/介面說明

| 類/介面 | 描述 |
|---|---|
| EntityManagerFactory | EntityManager 的工廠類,負責創建并管理 EntityManager 實體, |
| EntityManager | 物件持久化操作的介面 |
| Entity | 物體物件 |
| EntityTransaction | 事務介面,與 EntityManager 是一對一的關系 |
| Persistence | 該類用于創建 EntityManagerFactory |
| Query | JPQL 查詢介面,用于查詢或更新資料 |
類/介面之間的關系:

-
EntityManagerFactory 和 EntityManager 之間是一對多的關系,
-
EntityManager 和 EntityTransaction 之間是一對一.的關系,對于每個 EntityManager,都有一個 EntityTransaction,
-
EntityManager 和 Query 之間是一對多的關系,可以使用一個 EntityManager 執行多個查詢,
-
EntityManager 和 Entity 之間是一對多的關系,一個 EntityManage 可以管理多個物體,
5、JPA 常用注解
| 注解 | 說明 | 重要屬性 |
| @Entity | 宣告該類是一個物體類 | |
| @Table | 宣告物體類對應的表名 | |
| @Id | 宣告該屬性為主鍵 | |
| @GeneratedValue | 宣告主鍵的值自動生成 |
strategy:生成策略 generator:生成器 |
| @SequenceGenerator | 序列生成器 | sequenceName:序列名 name:生成器名稱 |
| @TableGenerator | 表生成器,通過表生成id | table:表名 name:生成器名稱 |
| @Column | 宣告屬性對應的欄位資訊 | name:欄位名稱 |
| @Transient | 宣告該屬性不持久到資料庫 | |
| @NamedQuery | 宣告靜態查詢 | |
| @NamedQueries | 宣告一組靜態查詢 | |
| @OneToOne | 一對一映射 | |
| @OneToMany | 一對多映射 | |
| @ManyToOne | 多對一映射 | |
| @ManyToMany | 多對多映射 |
6、JPA Id 生成策略
JPA 提供四種 Id 生成策略:
GenerationType.TABLE:使用一個特定的表來保存主鍵
GenerationType.SEQUENCE:根據底層資料庫的序列來生成主鍵,條件是資料庫支持序列,
GenerationType.IDENTITY:主鍵由資料庫自動生成(主要是自動增長型欄位)
GenerationType.AUTO:主鍵由 JPA 實作產品控制(默認的策略)
各資料庫對策略的支持情況如下:
| 資料庫 | 支持的策略 |
| MySQL |
GenerationType.TABLE |
| Oracle |
GenerationType.AUTO |
| PostgreSQL |
GenerationType.TABLE |
7、JPA JPQL
JPQL(Java Persistence Query Language)是一種面向物件的查詢語言,用于對持久化物體進行資料庫操作,JPQL 使用物體物件模型代替資料庫表來操作 SQL 查詢,JPA 會將 JPQL 轉換為 SQL,它為開發人員處理 SQL 任務提供了一個簡單的平臺,
JPQL 是物體 JavaBean 查詢語言 (EJBQL) 的擴展,為其添加了以下重要功能:
- 它可以執行連接操作,
- 它可以批量更新和洗掉資料,
- 它可以執行帶有排序和分組子句的聚合功能,
- 單值和多值結果型別,
JPQL 有如下特點:
- 它是一種獨立于平臺的查詢語言,
- 它簡單而穩定,
- 它可以與任何型別的資料庫一起使用,例如 MySQL、Oracle,
- JPQL 查詢可以靜態地宣告到元資料中,也可以動態地構建在代碼中,
8、JPA Criteria API(標準 API)
Criteria API 是一套預定義的 API,用于定義物體查詢, 是替換 JPQL 查詢的另一種方法, 這些查詢是型別安全的、可移植的并且易于通過更改語法進行修改, 與 JPQL 類似,它遵循抽象模式(易于編輯)和物件嵌入, 元資料 API 與標準 API 混合在一起,為標準查詢建模持久物體,標準 API 的主要優點是可以在編譯時更早地檢測到錯誤, 基于字串的 JPQL 查詢和基于 JPA 標準的查詢在性能和效率上是相同的,
Criteria API 的歷史:
在 JPA 2.0 中,開發了 Criteria API,使查詢標準化,
在 JPA 2.1 中,標準更新和洗掉(批量更新和洗掉)被增加進來,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/501777.html
標籤:其他
