JPA 之 深入浅出 --实例演示

    xiaoxiao2021-03-25  72

    关于 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:

    [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的执行过程.用一张图可以这样来表示:

     

    总结:

       JPAORM的一种标准,hibernateORM的一种实现.jpa的使用步骤和执行过程我们可以看出hibernate的实现就是以JPA的规范作为标准的.

    转载请注明原文地址: https://ju.6miu.com/read-40117.html

    最新回复(0)