![759dd44c28fe46e7af94b3deda98c89f.png](https://i-blog.csdnimg.cn/blog_migrate/acbb783bad8c516b8cd1cfa4fd87c1cc.jpeg)
摘要:本文主要介绍JPA和JPA移植,通过一个简单的入门案例来学习JPA,知道JPA是什么,和传统的ORM框架的区别。
1. 概述
1.1. JPA是什么
JPA 是Java Persistence API的缩写,是一套由Java官方制定的ORM 标准。当制定这套标准以后,市场上就出现很多JPA框架。如:OpenJPA(apache),EclipseTop(linktop)(eclipse),Hibernate。
1.2. 相关故事
自从Hibernate框架被JBoss公司收购之后,作者Gavin King也加入了JBoss公司,不久就开始与JBoss管理者的理念产生了分歧。最后还是离开了Jboss公司,加入到了java官方sun公司。在Sun公司期间就将ORM的理念作为标准发布,这个标准就是JPA。
当JPA出现后,基于JPA标准的ORM框架象雨后的春笋大量出现。其中比较出名的有:Apache基金会的OpenJPA,Eclipse社区的EclipseTop。标准化ORM的出现,直接威胁到了原来的ORM框架Hibernate。因此Hibernate框架不得不应战,于是也开始了对JPA标准的支持。
由于Hibernate的历史原因,Hibernate对JPA标准的支持有两套,兼容性的支持和完全性的支持。
1. 兼容性的支持:操作的接口使用Hibernate原来制定的,只有映射的注解使用JPA标准接口提供。
2. 完全性的支持:操作的接口和映射的注解全部使用JPA的标准。
1.3. Hibernate使用JPA规范解决了什么问题
使用注解来替代配置文件。
--问题:注解的作用?
注解的作用其实就是代替配置文件,将程序的元数据写在代码上,所谓的元数据就是,程序必须依赖的数据。
--问题:为什么需要使用注解替代配置文件呢?
答:配置文件不是编程语言的语法,所以是无法断点调试。而注解是Java语法,报错的时候可以 快速的定位问题。
2. 兼容性地支持JPA规范
2.1. 说明
Hibernate兼容性支持JPA规范:就是操作的接口是Hibernate原来指定的,只有映射注解使用JPA标准接口提供的。
2.2. 需求
将一个原来使用xml配置的入门示例修改使用注解实现,仅仅将映射文件修改为注解,其他不变。
2.3. 配置步骤
第一步:删除掉XML映射文件
![4d2a6047381dc273575cfaa6fee60857.png](https://i-blog.csdnimg.cn/blog_migrate/3b374ba46611606e705dd0f7228fcb5b.png)
第二步:将映射的注解写在实体类里面
// @Entity注解,指定该实体类是一个基于JPA规范的实体类
第三步:修改总配置文件hibernate.cfg.xml加载的是映射的实体类
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 配置DB连接4要素 -->
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate?serverTimezone=UTC</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- 配置映射实体类 -->
<mapping class="org.brick.pojo.Student" />
</session-factory>
</hibernate-configuration>
第四步:测试(就原来的代码)
@Test
3. 完全性地支持JPA标准
所谓Hibernate框架完全性地支持JPA标准,就是操作框架的API和映射注解都全部使用JPA的标准来实现。
意思就是不使用Hibernate原来的接口和类,而使用由JPA标准规范制定的类和接口来实现。那么入门Hibernate-JPA,只需知道JPA规范使用了哪些类名和接口名来替代原来Hibernate的操作类和接口即可。
3.1. JPA配置流程图
[1] 需要一个总配置文件存储框架需要的信息。(注意:配置文件必须要放在classpath:/META-INF/persistence.xml)
[2] 需要通过Persistence类来获得配置文件的信息,构造EntityManagerFactory(实体管理工厂)
[3] 通过实体管理工厂对象获得操作类对象,实体管理类对象。
[4] 操作类操作数据库表之前,必须要配置一个和数据表关联的实体类(有关联注解的),不要忘了在总配置文件加载实体类。
3.2. 入门示例
3.3. 配置步骤说明
1. 导入包
2. 创建一个总配置文件(persistence.xml)
3. 创建一个帮助类,JPAUtils。获得操作对象(EntityManager)
4. 创建一个实体类,并且配置映射的注解
5. 创建一个测试类--插入
3.4. 需求
编写一个JPA的项目,插入一条数据到学生信息表。
3.5. 配置步骤
第一步:搭建环境
方式一(自行导入所需jar包)
--HIbernate支撑包
![a7dc2e0c00db724a095ff4e8c6663f7a.png](https://i-blog.csdnimg.cn/blog_migrate/03b13f772a138dd9e006ddb8785e56fa.jpeg)
--HIbernate的JPA规范的实现包,完全性支持JPA必须加入
![3b480064588e3f837ca0f6dd5b406468.png](https://i-blog.csdnimg.cn/blog_migrate/9a44179ae07c64c8c015b22a05ddd978.png)
--驱动包--
![75ff44992f5d2d0d965ce4be4c351762.png](https://i-blog.csdnimg.cn/blog_migrate/97d304eee93633f507969d28fa8cd8f3.png)
方式二(导入依赖,推荐方式)
--hibernate+JPA依赖
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.4.1.Final</version>
</dependency>
--驱动包依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
第二步:创建一个总配置文件
注意:总配置文件必须放在”classpath:/META-INF/persistence.xml”路径下。
如果想要IDEA创建一个JPA总配置文件,需要添加一个JPA模块,随后可以生成配置文件到项目中。
--总配置文件
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1">
<!-- 持久单元,配置一个数据库连接 -->
<persistence-unit name="mysql-jpa">
<!-- DB连接四要素 -->
<properties>
<!-- 这里使用Hibernate-JPA -->
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/hibernate?serverTimezone=UTC"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value="root"/>
<!-- 格式化输出SQL语句 -->
<property name="hibernate.format_sql" value="true"/>
</properties>
</persistence-unit>
</persistence>
第三步:创建一个工具类JPAUtils
创建一个工具类JPAUtils,获得操作对象。
public
第四步:创建一个映射的实体类
创建一个映射的实体类,将JPA的映射注解写在实体类里面。
@Entity
第五步:总配置文件加载映射实体类
修改persistence.xml,配置映射实体类。
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1">
<!-- 持久单元,配置一个数据库连接 -->
<persistence-unit name="mysql-jpa">
<!-- 配置实体类 -->
<!-- 注意:Hibernate-JPA实现了自动配置映射实体类,所以不配置也是可以的,但是建议还是加上这个配置,方便后期维护 -->
<class>org.brick.pojo.Student</class>
<!-- DB连接四要素 -->
<properties>
<!-- 这里使用Hibernate-JPA -->
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/hibernate?serverTimezone=UTC"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value="root"/>
<!-- 格式化输出SQL语句 -->
<property name="hibernate.format_sql" value="true"/>
</properties>
</persistence-unit>
</persistence>
第六步:测试
--测试代码
@Test
3.6. 将Hibernate配置的纯JPA代码移植到OpenJPA
3.6.1. 说明
如果代码使用纯JPA标准编写,那么不修改java代码代码,而只需修改一下配置文件,即可将HIbernate的代码移植到其他的JPA框架(OpenJPA、EclipseTOP)。
注意:Hibernate是这么多JPA框架里面,性能最好的一个!
3.6.2. 示例代码
通过这个示例,可以证明只要符合JPA规范的代码,可以在基于JPA规则的框架相互切换。
不修改代码,只修改了配置文件,如下:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<!-- 持久单元,配置一个数据库连接 -->
<persistence-unit name="mysql-jpa">
<!-- 配置实体类 -->
<class>org.brick.pojo.Student</class>
<!-- DB连接四要素 -->
<properties>
<!-- 这里使用Open-JPA -->
<property name="ConnectionDriverName" value="com.mysql.cj.jdbc.Driver"/>
<property name="ConnectionURL" value="jdbc:mysql://localhost:3306/hibernate?serverTimezone=UTC"/>
<property name="ConnectionUserName" value="root"/>
<property name="ConnectionPassword" value="root"/>
</properties>
</persistence-unit>
</persistence>
注意:OpenJPA使用的是JPA2.0规范,而Hibernate使用的是JPA2.1规范。所以将Hibernate编写的JPA代码切换OpenJPA的代码,需要修改配置文件版本。