JPA全称为Java Persistence API ,Java持久化API是Sun公司在Java EE 5规范中提出的Java持久化接口。JPA吸取了目前Java持久化技术的优点,旨在规范、简化Java对象的持久化工作。使用JPA持久化对象,并不是依赖于某一个ORM框架。
项目基本结构:
1、新建java项目或web项目,因为jpa属于持久层,与前端无关
所需架包见下面的资源,因为jpa是规范所以有些需要hibernate或者其他方式实现
http://download.youkuaiyun.com/detail/yongzhian/8100313
2 /jpa/src/META-INF/persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="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 http://java.sun.com/xml/ns/persistence/persistence_2_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="admins" />
<property name="hibernate.connection.password" value="root" />
<property name="hibernate.connection.url" value="jdbc:mysql://10.6.0.204:3306/commonuser" />
<property name="hibernate.max_fetch_depth" value="3" />
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
<persistence-unit name="mysqlJPA1" 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="admins" />
<property name="hibernate.connection.password" value="root1" />
<property name="hibernate.connection.url" value="jdbc:mysql://10.6.0.204:3306/commonuser" />
<property name="hibernate.max_fetch_depth" value="3" />
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
</persistence>
EntityManager对象的事务管理方式有两种,分别为JTA和RESOURCE_LOCAL,即Java Transaction API方法和本地的事务管理。
JTA事务
(Java Transaction API)是J2EE规范中有关事务的标准。它是容器级别的事务,只能运行在J2EE服务器中。它的最大优势是可以支持分布式的事务,如果系统采用的是分布式的数据库,那么只能选择JTA管理EntityManager事务。
使用JTA管理EntityManager事务时,需要注意以下几个问题。
— JTA事务只能运行在J2EE的环境中,即EJB容器中和Web容器中;而在J2SE环境中只能使用RESOURCE_LOCAL管理事务。
RESOURCE_LOCAL管理事务
RESOURCE_LOCAL事务数据库本地的事务。它是数据库级别的事务,只能针对一种数据库,不支持分布式的事务。对于中小型的应用,可以采用RESOURCE_LOCAL管理EntityManager事务。
使用RESOURCE_LOCAL管理EntityManager事务时需要注意以下几个问题。
— 在J2SE环境中,只能使用RESOURCE_LOCAL管理EntityManager事务,并且EntityManager对象是以应用托管方式获得的。
— 代码中使用RESOURCE_LOCAL管理事务时,要通过调用EntityManager的getTransac- tion()方法获得本地事务对象。
采用RESOURCE_LOCAL管理事务时,要保证数据库支持事务。例如使用MySQL时,需要设置数据库的引擎类型为“InnoDB”,而“MyISAM”类型是不支持事务的。3 /jpa/src/com/base/test/BaseJunit.java
package com.base.test;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.junit.BeforeClass;
import org.junit.Test;
import com.bean.Person;
public class BaseJunit {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@Test
public void createTable() {
// 可以验证生成表是否正确
EntityManagerFactory factory = Persistence
.createEntityManagerFactory("mysqlJPA");
factory.close();
}
@Test
public void save() {
EntityManagerFactory factory = Persistence
.createEntityManagerFactory("mysqlJPA");//如果写null会找第一个persistence-unit
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
Person person = new Person(); // person为new状态
person.setName("zhang san");
em.persist(person); // 持久化实体
em.getTransaction().commit();
em.close();
factory.close();
}
// new 、托管、脱管、删除
@Test
public void update() {
EntityManagerFactory factory = Persistence
.createEntityManagerFactory("mysqlJPA");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
Person person = em.find(Person.class, 1);
person.setName("hmk"); // person为托管状态
em.getTransaction().commit();
em.close();
factory.close();
}
@Test
public void update2() {
EntityManagerFactory factory = Persistence
.createEntityManagerFactory("mysqlJPA");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
Person person = em.find(Person.class, 1);
em.clear(); // 把实体管理器中的所有实体变为脱管状态
person.setName("hmk2");
em.merge(person); // 把脱管状态变为托管状态,merge可以自动选择insert or update 数据
em.getTransaction().commit();
em.close();
factory.close();
}
@Test
public void remove() {
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 find() {
EntityManagerFactory factory = Persistence
.createEntityManagerFactory("mysqlJPA");
EntityManager em = factory.createEntityManager();
Person person = em.find(Person.class, 2); // 类似于hibernate的get方法,没找到数据时,返回null
System.out.println(person.getName());
em.close();
factory.close();
}
@Test
public void find2() {
EntityManagerFactory factory = Persistence
.createEntityManagerFactory("mysqlJPA");
EntityManager em = factory.createEntityManager();
Person person = em.getReference(Person.class, 2); // 类似于hibernate的load方法,延迟加载.没相应数据时会出现异常
System.out.println(person.getName()); // 真正调用时才查找数据
em.close();
factory.close();
}
}
@PersistenceContext (unitName="mysqlJPA") 只能是javaEE中实现,javaSE中需要与Hibernate配合设置3 /jpa/src/com/bean/Person.java
/**
* @Project: jpa
* @Title: Person.java
* @Package com.bean
* @author yongzhian
* @date 2014-10-30 下午2:20:23
* @Copyright: 2014 www.yineng.com.cn Inc. All rights reserved.
* @version V1.0
*/
package com.bean;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* @ClassName Person
* @Description 模块描述
* @author yongzhian
* @Date 2014-10-30
*/
@Entity
@Table(name="user_baseinfo")
public class Person {
@Id
@Column(name = "info_id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column(name = "info_name")
private String name;
/**
* @return id
*/
public Integer getId() {
return id;
}
/**
* @param id 要设置的 id
*/
public void setId(Integer id) {
this.id = id;
}
/**
* @return name
*/
public String getName() {
return name;
}
/**
* @param name 要设置的 name
*/
public void setName(String name) {
this.name = name;
}
}
JPA注解 :(http://blog.youkuaiyun.com/zzkk_1980/article/details/6015410)
1、@Entity(name="EntityName")
2、@Table(name="",catalog="",schema="")
3、@id
4、@GeneratedValue(strategy=GenerationType,generator="")
5、@Basic(fetch=FetchType,optional=true)
6、@Column
7、@Transient
8、@ManyToOne(fetch=FetchType,cascade=CascadeType)
9、@JoinColumn
10、@OneToMany(fetch=FetchType,cascade=CascadeType)
11、@OneToOne(fetch=FetchType,cascade=CascadeType)
12、@ManyToMany
13、@MappedSuperclass