在上一篇博客博客<<深入浅出JPA--概述>>中,已经对JPA进行了一个简单的介绍,本篇博客就给大家介绍一下关于JPA的具体使用步骤具体的步骤如下:
(1)创建persistence.xml配置持久化单元,在此文件中需要指定跟哪个数据库进行交互,由于JPA本身没有持久化能力,所以需要指定JPA使用哪个持久化的框架.它就相当于hibernate中的hibernate.cfg.xml
(2)创建EntityManagerFactory,它类似于hibernate中的sessionFactoy的作用
(3)创建EntityManager(实体管理器),类似于hibernate中的session.
(4)创建实体类,使用annotation来描述实体类跟数据库表之间的一一映射关系.
(5)使用JPA API 完成数据库增删改查操作.
persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
xmlns:persistence="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence persistence_1_0.xsd ">
<persistence-unit name="mysqlJPA" transaction-type="RESOURCE_LOCAL">
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
<property name="hibernate.connection.username" value="root" />
<property name="hibernate.connection.password" value="123456" />
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3309/jpadb" />
<property name="hibernate.max_fetch_depth" value="3" />
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
</persistence>
实体Entity:
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Person {
private Integer id;
private String name;
@Id @GeneratedValue
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(length=12)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
单元测试类junitTest
import it.tanghuan.bean.Person;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.junit.BeforeClass;
import org.junit.Test;
public class jpaTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@Test
public void createTable() {
EntityManagerFactory factory = Persistence
.createEntityManagerFactory("mysqlJPA");
factory.close();
}
@Test
public void Testsave() {
EntityManagerFactory factory = Persistence
.createEntityManagerFactory("mysqlJPA");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin(); // 开始事务
Person person = new Person();
person.setName("huagngua");
em.persist(person); // 持久化实体
em.getTransaction().commit(); // 提交事务
em.close();
factory.close();
}
@Test
public void Testupdate() {
EntityManagerFactory factory = Persistence
.createEntityManagerFactory("mysqlJPA");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin(); // 开始事务
Person person = em.find(Person.class, 1);
person.setName("tanghuan"); // person为托管状态
em.persist(person); // 持久化实体
em.getTransaction().commit(); // 提交事务
em.close();
factory.close();
}
@Test
public void Testupdate2() {
EntityManagerFactory factory = Persistence
.createEntityManagerFactory("mysqlJPA");
EntityManager em = factory.createEntityManager(); // 创建实体管理器
em.getTransaction().begin(); // 开始事务
Person person = em.find(Person.class, 1);
em.clear(); // 把实体管理器中的所有实体变为脱管状态
person.setName("tanghuan2"); // person为托管状态
em.merge(person); // 把脱管状态变为托管状态,merge可以自动选择inser or update数据
em.getTransaction().commit(); // 提交事务
em.close();
factory.close();
}
@Test
public void Testremove() {
EntityManagerFactory factory = Persistence
.createEntityManagerFactory("mysqlJPA");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin(); // 开始事务
Person person = em.find(Person.class, 1);
em.remove(person); // 删除实体
em.getTransaction().commit(); // 提交事务
em.close();
factory.close();
}
@Test
public void Testfind() {
EntityManagerFactory factory = Persistence
.createEntityManagerFactory("mysqlJPA");
EntityManager em = factory.createEntityManager();
Person person = em.find(Person.class, 2);
System.out.println(person.getName());
em.close();
factory.close();
}
@Test
public void Testfind2() {
EntityManagerFactory factory = Persistence
.createEntityManagerFactory("mysqlJPA");
EntityManager em = factory.createEntityManager();
Person person = em.getReference(Person.class, 2); // 延迟加载,没有相应数据时会出现异常
// ,类似hibernate中的load.在未调用的时候,person.getid和person.getname都为null
System.out.println(person.getName()); // 真正调用时才加载数据
em.close();
factory.close();
}
}
麻雀虽小,五脏俱全,一个小小的demo完整表现了JPA的执行过程.用一张图可以这样来表示:
总结:
在上一篇博客中说过,JPA是ORM的一种标准,而hibernate是ORM的一种实现.从jpa的使用步骤和执行过程我们可以看出hibernate的实现就是以JPA的规范作为标准的.