Python 絕對是一門易學難精的語言,打著簡單語法的旗號把我忽悠過來,最後發現它背後隱藏了許多複雜的實現。 如果不是作為 “玩具” 語言來學習,一定要看看全方位細緻講解的書《Python學習手冊第5版》。它涵蓋了 Python 的每一個角落,讓我明白了版本差異、作用域、函數式編程工具、相對導入、m ...
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 中,標準更新和刪除(批量更新和刪除)被增加進來。