在上一篇部落格部落格<<深入淺出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;@Entitypublic class Person {private Integer id;private String name;@Id @GeneratedValuepublic 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 {@BeforeClasspublic static void setUpBeforeClass() throws Exception {}@Testpublic void createTable() {EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");factory.close();}@Testpublic 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();}@Testpublic 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();}@Testpublic 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();}@Testpublic 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();}@Testpublic 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();}@Testpublic void Testfind2() {EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysqlJPA");EntityManager em = factory.createEntityManager();Person person = em.getReference(Person.class, 2); // 消極式載入,沒有相應資料時會出現異常// ,類似hibernate中的load.在未調用的時候,person.getid和person.getname都為nullSystem.out.println(person.getName()); // 真正調用時才載入資料em.close();factory.close();}}
麻雀雖小,五髒俱全,一個小小的demo完整表現了JPA的執行過程.用一張圖可以這樣來表示:
總結:
在上一篇部落格中說過,JPA是ORM的一種標準,而hibernate是ORM的一種實現.從jpa的使用步驟和執行過程我們可以看出hibernate的實現就是以JPA的規範作為標準的.