一、JPA(Java持久化API)
JPA为JavaEE平台提供了ORM框架的规范。
JPA包含大量方便易用的API,可以使开发人员摆脱繁重的JDBC底层处理,以更加面向对象的方式进行持久化操作。
JPA操作的持久化对象称为实体。
- 实体、实体主键、实体与表的对应关系
- 实体的生命周期
- 持久化上下文的原理
- 实体管理器的持久化操作方法
3.1 JAP概述
- JPA(Java Persistence API,Java持久化API)为Java EE平台提供了ORM框架的规范。JPA是位于JDBC 之上的一个更高层抽象,包含大量方便易用的API,可以使开发人员摆脱繁重的JDBC底层处理,以更加面向对象的方式进行持久化操作。
3.1.1 ORM
-
ORM(Object-Relational Mapping,对象关系映射) 是解决对象和关系模型的不匹配问题的一种框架。
-
由于对象和关系模型采用了不同的数据组织形式,造成使用面向对象方式操作关系型的数据变得尤为困难。
ORM 的解决方法是:
(1)提供一种专门负责持久化的容器,预先配置映射关系,自动生成SQL语句,提高开发效率。
(2)由持久化容器提供可控制的加载策略和适当范围的缓存。
表3-1 对象和关系模型中的对应概念
Java面向对象模型 | 关系模型 |
---|---|
类 | 表 |
对象(实例) | 记录(行) |
状态(属性) | 字段(列) |
行为(方法) | 存储过程、触发器等于对象的方法基本对应 |
身份(引用) | 主键 |
对其他对象的引用 | 外键关系 |
继承和多态 | 不支持 |
3.1.2 JPA持久化提供器
同JDBC类似,JPA只是一个规范,并没有具体实现。但JPA是Java EE规范,所以符合Java EE规范的容器都应该提供JPA的具体实现,这称为JPA持久化提供器。(类似于JDBC驱动程序)
JBOSS默认使用Hibernate作为持久化提供器。
3.2 JPA实体
-
JPA操作的持久化对象称为实体(Entity),简单的POJO就可以被JPA持久化,但需要配置基本的映射关系。大部分情况下,实体对应于数据库中的表,实体的属性对应于表的列,实体的每个对象则对应表中的每条记录。
-
为了完成数据持久化,应用程序需要通过JPA中特定注解标识各种映射关系提供给JPA持久化提供器
-
JPA使用的所有注解都位于javax.persistence包下。
-
标识一个实体必须要有**@Entity** 和**@Id**两个注解,其他的映射关系提供默认行为。
3.2 JPA实体
3.2.1声明实体
只需在类上加上**@Entity注解即可声明为JPA**实体。
3.2.2实体主键
每个实体必须有一个主键,且是唯一的。JPA支持使用基本类型和Serializable类型的属性作为实体的主键。使用**@Id注解将实体的一个属性声明为主键。除了直接声明在属性上,通常更推荐在get方法上声明主键**。
3.2.3映射实体
映射表: @Table(name=“user”) 实体类前
映射列: @Column(name=“id”) get方法前
-
如果省略@Table和 @Column注解,则分别默认会被映射到与实体类同名的表以及与实体属性名称相同的列。
-
如果实体中存在不需要被映射的列时,必须使用@Transient注解进行显式的声明
3.2.4 生成主键值
-
JPA要求实体必须具有主键,实体的主键值可以在应用程序中指定,通常有数据库自动生成,使用@GeneratedValue注解指定主键值生成方式, 主要取决于GenerationType的四个值:
-
身份列(GenerationType.IDENTITY)
-
序列(GenerationType.SEQUENCE)
-
表生成器(GenerationType.TABLE)
默认策略(GenerationType.AUTO)
Produce.java
@Entity
@Table