JPA:Java Persistence API,Java持久层API。是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
类似于JDBC,JPA是一组规范(接口),使应用程序以统一方式访问持久层。
JPA和Hibernate的关系
JPA 是规范: JPA 本质上就是一种 ORM 规范,不是ORM 框架 —— 因为 JPA 并未提供 ORM 实现,它只是制订了一些规范,提供了一些编程的 API 接口,但具体实现则由 ORM 厂商提供实现;
Hibernate 是实现: Hibernate 除了作为 ORM 框架之外,它也是一种 JPA 实现
JPA优势
JPA常用的注解有:
下面看看这些注解的具体含义。
(1)@Entity
Entity 标注用于实体类声明语句之前,指出该Java 类为实体类,将映射到指定的数据库表。如声明一个实体类 Student,它将映射到数据库中的 student表上。
如:
@Entity
public class Student {
private int id;
private String name;
private int age;
....
}
则Student类在数据库中会对应一个数据表:student。
(2)@Table
当实体类与其映射的数据库表名不同名时需要使用 @Table 标注说明,该标注与 @Entity 标注并列使用,置于实体类声明语句之前,可写于单独语句行,也可与声明语句同行。
@Table(name = "student_table")
@Entity
public class Student {
private int id;
private String name;
private int age;
....
}
(3)@Id
@Id :用于声明一个实体类的属性映射为数据库的主键列。可置于属性的getter方法之前。
如下:属性id被设置为数据表中主键。
@Id
public int getId() {
return id;
}
(4)@GeneratedValue
@GeneratedValue:设置主键的生成策略。
有如下策略:
MySQL常用自增:IDENTITY.
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public int getId() {
return id;
}
(5)@@Basic
@Basic:表示一个简单的属性到数据库表的字段的映射,对于没有任何标注的 getXxxx() 方法,默认即为@Basic。
(6)@Column
@Column:当实体的属性与其映射的数据库表的列不同名时需要使用@Column 标注说明。
常用属性:name,unique 、nullable、length 等。
(7)@Transient
@Transient:表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性;
(8)@Temporal
@Temporal:在核心的 Java API 中并没有定义 Date 类型的精度(temporal precision). 而在数据库中,表示 Date 类型的数据有 DATE, TIME, 和 TIMESTAMP 三种精度(即单纯的日期,时间,或者两者 兼备). 在进行属性映射时可使用@Temporal注解来调整精度。
JPA中用于创建实体管理器的相关API:
JPA中用于CRUD的相关API:
下面来看看具体的用法。
在应用执行CRUD前后需要执行如下初始化和关闭资源操作:
//----------------初始化------------------
//获取EntityManagerFactory实例
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("wgs-jpa");
//创建EntityManager 实例,EntityManager 是完成持久化操作的核心对象
EntityManager entityManager = entityManagerFactory.createEntityManager();
//EntityTransaction:管理资源层实体管理器的事务操作
EntityTransaction entityTransaction = entityManager.getTransaction();
entityTransaction.begin();
//----------------关闭资源------------------
entityTransaction.commit();
entityManager.close();
entityManagerFactory.close();
(1)Persistence类:
Persistence 类是用于获取 EntityManagerFactory 实例。该类包含一个名为 createEntityManagerFactory 的 静态方法 。
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("wgs-jpa");
(2)EntityManagerFactory类:
EntityManagerFactory 接口主要用来创建 EntityManager 实例。该接口约定了如下4个方法:
(3)EntityManager类
EntityManager 是完成持久化操作的核心对象。即将普通Java对象持久化保存到数据库当中,同时可以根据主键查找Entity Bean。
实体的状态:
(4)EntityTransaction类:
EntityTransaction 接口用来管理资源层实体管理器的事务操作。通过调用实体管理器的getTransaction方法 获得其实例。
EntityManager相关API: