1、JPA简介
JPA是Java Persistence API的简称。
JPA作为 Java EE 5.0 平台标准的对象关系映射(ORM),规范将得到所有 Java EE 服务器的支持。 Sun 这次吸取了之前 EJB 规范惨痛失败的经历,在充分吸收现有 ORM 框架(如Hibernate)的基础上,得到了一个易于使用、伸缩性强的 ORM 规范。
随着注解使用方式普及,从目前的开发社区的反应上看 JPA 受到了极大的支持和赞扬, JPA 作为 ORM 领域标准化整合者的目标已经实现。
2、Hibernate和JPA的关系
Hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JDBC进行了非常轻量级(相对于EJB这一套)的对象封装,它将POJO(就是模型对象)与数据库表建立映射关系,是一个全自动的orm框架,Hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
JPA是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据。他的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate、TopLink(现在叫EclipseLink)等ORM框架各自为营的局面。
值得注意的是,JPA是在充分吸收了现有Hibernate、TopLink等ORM框架的基础上发展而来的,具有易于使用、伸缩性强等优点。
3、简单一句话
JPA是持久化规范,而Hibernate等是其实现。
4、复合主键
一般我们设计主键都是使用没有业务含义的一个字段如id,自增作为主键;而有时候业务需要2-n个字段同时作为主键,经典案例就是航空项目里面起飞城市和目的城市,如果要确定唯一的航线就可以用起飞城市和目的城市一起来表示;
JPA配置复合主键方式有3种,这里讲解第一种。
5、需要添加的jar文件
6、配置文件
persistence.xml不要放错位置:必须在classpath编译目录下META-INF/下面。
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
7、模型配置
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "t_air_line")
public class AirLine implements Serializable {
private static final long serialVersionUID = -2432145316543676L;
@Id
@Column(length = 3)
private String startCity;
@Id
@Column(length = 3)
private String endCity;
private String name;
public String getStartCity() {
return startCity;
}
public void setStartCity(String startCity) {
this.startCity = startCity;
}
public String getEndCity() {
return endCity;
}
public void setEndCity(String endCity) {
this.endCity = endCity;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "AirLine [startCity=" + startCity + ", endCity=" + endCity + ", name=" + name + "]";
}
}
8、自动生成的ddl语句
CREATE TABLE `t_air_line` (
`startCity` varchar(3) NOT NULL,
`endCity` varchar(3) NOT NULL,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`startCity`,`endCity`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
9、JPAUtils
public class JPAUtils {
// 保证EntityManagerFactory是单例
private static EntityManagerFactory entityManagerFactory;
static {
try {
// 对应配置文件里面的persistence-unit name="cn.itsource.jpa"
entityManagerFactory = Persistence.createEntityManagerFactory("cn.itsource.jpa");
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("解析配置文件或者映射配置出现异常:" + e.getMessage());
}
}
public static EntityManager getEntityManager() {
return entityManagerFactory.createEntityManager();
}
}
10、测试类
package cn.itsource.jpa.id;
import javax.persistence.EntityManager;
import org.junit.Before;
import org.junit.Test;
import cn.itsource.jpa.util.JPAUtils;
public class JPATest {
@Before
public void save() throws Exception {
AirLine airLine = new AirLine();
// 设置主键
airLine.setStartCity("CTU");
airLine.setEndCity("WUH");
// 设置其他信息
airLine.setName("成都飞武汉");
EntityManager entityManager = JPAUtils.getEntityManager();
entityManager.getTransaction().begin();
entityManager.persist(airLine);
entityManager.getTransaction().commit();
entityManager.close();
}
@Test
public void find() throws Exception {
EntityManager entityManager = JPAUtils.getEntityManager();
// 主键
AirLine airLinePk = new AirLine();
airLinePk.setStartCity("CTU");
airLinePk.setEndCity("WUH");
// 传入主键进行查询
AirLine airLine = entityManager.find(AirLine.class, airLinePk);
System.out.println(airLine);
entityManager.close();
}
}