(1)创建persistence.xml配置持久化单元,在此文件中需要指定跟哪个数据库进行交互,由于JPA本身没有持久化能力,所以需要指定JPA使用哪个持久化的框架.它就相当于hibernate中的hibernate.cfg.xml
(2)创建EntityManagerFactory,它类似于hibernate中的sessionFactoy的作用
(3)创建EntityManager(实体管理器),类似于hibernate中的session.
(4)创建实体类,使用annotation来描述实体类跟数据库表之间的一一映射关系.
(5)使用JPA API 完成数据库增删改查操作.
persistence.xml:
[java] view plain copy print ? <?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:
[java] view plain copy print ? 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
[html] view plain copy print ? 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的规范作为标准的.