JPA(Java Persistence API)是一个规范,通过提供 ORM 功能,使开发者能够利用 Java Domain Model 控制关系数据库。JPA 仅是一个规范,目前业界有几种不同的实现,例如 Hibernate、EclipseLink、TopLink、Open JPA 等。Spring Boot2 默认使用 Hibernate 作为底层实现。
JPA 的主要关注点在 ORM 层。ORM(Object-Relational Mapping)是指从 Java object 转换到数据库表的过程。
Entity(实体)就是简单的 POJO 对象,例如表示学生的 Student 类、表示国家的 Country 类等。JPA 中定义了@Entity
来标识某个类是实体类。被标记的实体类必须满足:
- 包含无参构造器
- 必须指定标识符,即
@Id
标注的,用来定义表中的主键 - 必须不能被 final 修饰,因为 JPA 实现通常会尝试继承实体类来扩展其功能
01-主键标识符
Hibernate 中主键标识符用来指明实体类中的属性作为对应数据库表中的主键。主键标识符一般可分为四种类型:简单标识符、生成标识符(Generated Identifiers)、复合标识符和派生标识符。
- 简单标识符。最简单的一种,指使用
@Id
标注标识在实体类的属性来声明的标识符。支持的属性类型包括三类:基本类型、基本类型的包装类型和 String、Date、BigDecimal、BigInteger。 - 生成标识符。指通过
@Id
和@GeneratedValue
注解标注的,在持久化时有 JPA 实现自动生成的标识符。此类标识符根据生成策略不同,划分为五类:
GenerationType.AUTO
,不显示指定策略时,默认使用此策略。对数字类型的属性值,使用基于 sequence 或 table 的策略,对于 UUID 类型的使用 UUIDGenerator(需 Hibernate 5及以上版本)。GenerationType.IDENTITY
,基于 IdentityGenerator,要求目标数据库表中存在 identify 列。例如,MySQL 中可以在建表时声明某个列为 auto_increment,当 JPA 实现插入数据时会自动递增。GenerationType.SEQUENCE
,基于 SequenceStyleGenerator,用于支持 Oracle 等这种可以定义 Sequence 的数据库。例如:
@Id
@GeneratedVa