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 中,标准更新和删除(批量更新和删除)被增加进来。