深入浅出JPA--实例

    在上一篇博客博客<<深入浅出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的执行过程.用一张图可以这样来表示:

 

总结:

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


评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

弯_弯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值