JPA
1.JPA 是java对象的持久化的API
2.javaEE 5.0标准的ORM规范,让应用程序进行统一的一种方式来进行访问
持久化的数据
3.之前是java程序之间进行调用ORM框架,但是ORM框架特别的多,每个ORM框架的实现都是不一样 那么程序员开发特别的繁琐,
sun公司提供了一套标准(JPA) ,让程序员来进行使用这套JPA的规范
那么不同的ORM框架需要对应的实现,那么这些实现就是对应的厂商来进行提供实现
优点
标准化
简单易用,便于集成
支持编写对象的高级特性
技术点
ORM 映射的元数据
jpa的API
JPQL
通过面向对象而非面向数据库的查询语句
https://jcp.org/aboutJava/communityprocess/mrel/jsr338/index.html
入门
配置
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="jpa-01" transaction-type="RESOURCE_LOCAL">
<class>com.java.jpa.Users</class>
<properties>
</properties></persistence-unit></persistence>
<property name="hibernate.hbm2ddl.auto" value="update" /> <!--显示sql--> <property name="hibernate.show_sql" value="true" /> <!--格式化sql--> <property name="hibernate.format_sql" value="true" /> </properties> </persistence-unit>
实体类
@Table(name = "JPA_USERS")
//指定持久化类
@Entity
public class Users {
/**
*/ private Integer id ; /** */ private String name ; /** */ private Integer age ; /** */ private String lovel; @Id//主键 //进行配置主键的生成的策略 @GeneratedValue(strategy = GenerationType.IDENTITY) //设置为只增 public Integer getId() { return id; }
//指定数据库的表名称
@Table(name = "JPA_USERS")
//指定持久化类
@Entity
//与@Table(name = "JPA_USERS") 类似,生成多表
//@SecondaryTable(name = "JPA_USERS_TABLE")
/**
@Access(AccessType.FIELD) 通过反射的方式
@Access(AccessType.PROPERTY) 通过实体类的get set 方法来进行映射
/
//@Access(AccessType.PROPERTY)
public class Users {
/***/
// private Integer id ;
private String id ;
private String name ; private Integer age ; private String lovel; private Date startDate; @Id @GeneratedValue(generator = "uuid-hex") //设置为字符串 @GenericGenerator(name="uuid-hex",strategy = "uuid") @Column(length = 32) public String getId() { return id; } public void setId(String id) { this.id = id; } //进行配置主键的生成的策略 /** * GenerationType.TABLE 通过表来进行生成 * GenerationType.IDENTITY 自增 * GenerationType.AUTO 根据数据库的默认生成策略 * 其他生成策略 * UUID */
/* @Id//主键
// @GeneratedValue(strategy = GenerationType.IDENTITY) //设置为只增
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}/
/*
* 设置时间的
* 年月日
* 时分秒
* TemporalType.TIMESTAMP 年月日 时分秒
* TemporalType.DATE 年月日
* TemporalType.TIME 时分秒
* ....
* @return
*/
@Temporal(TemporalType.TIME)
public Date getStartDate() {
return startDate;
}
public void setStartDate(Date startDate) { this.startDate = startDate; } public String getName() { return name; } /** 一个简单的属性到数据库中的映射 对应没有任何标注的get xx方法默认的就是该注解 fetch 表示该属性的读取策略, FetchType.EAGER 抓取 、 FetchType.LAZY 懒加载/延迟加载 optional = false 表示是否允许为空null 默认为true */ @Basic(fetch = FetchType.LAZY,optional = false) public void setName(String name) { this.name = name; } /** 当属性名称和表字段不一样的时候 就可以进行使用该注解 */ @Column(name = "last_age",length = 50,nullable = false) public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } /** * 如果一个属性不要在数据库表中映射 * @return */ @Transient public String getLovel() { return lovel; } public void setLovel(String lovel) { this.lovel = lovel; }
}
单向多对一的关联关系
package com.java.bo;
import com.sun.corba.se.impl.interceptors.PICurrent;
import javax.persistence.*;
@Table(name = "JPA_ORDERS")
@Entity
public class Ordres {
private Integer id ;
private String name ;
private Person person; /** * 映射单向的 N-1 * 使用注解 @ManyToOne 来进行映射 * 指定外键的名称 * @return */ @JoinColumn(name = "person_pid") //进行设置懒加载 @ManyToOne(fetch = FetchType.LAZY) public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Integer getId() {
return id;
}
public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; }
}
@Table(name = "JPA_PERSON")
@Entity
public class Person {
private Integer pid ; private String pname ; private Date date; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) public Integer getPid() { return pid; } @Temporal(TemporalType.DATE) public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public void setPid(Integer pid) { this.pid = pid; } public String getPname() { return pname; } public void setPname(String pname) { this.pname = pname; }
}
单向一对多
@Table(name = "JPA_DOG")
@Entity
public class Dog {
/** */ private Integer id ; /** */ private String name; private List<DogFood> dogFoods=new ArrayList<>(); @Id @GeneratedValue(strategy = GenerationType.IDENTITY) public Integer getId() { return id; } @JoinColumn(name = "food_id") @OneToMany public List<DogFood> getDogFoods() { return dogFoods; } public void setDogFoods(List<DogFood> dogFoods) { this.dogFoods = dogFoods; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; }
}
@Table(name = "JPA_DOGFOOD")
@Entity
public class DogFood {
/** */ private Integer id ; /** */ private String name ; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; }
}
================================
双向一对多
//指定数据库的表名称
@Table(name = "JPA_ORDERS3")
//指定持久化类
@Entity
public class Orders3 {
private Integer id ;
private String name ; private List<Person3> Person3=new ArrayList<>(); @OneToMany(mappedBy ="orders3" ) public List<Person3> getPerson3() { return Person3; } public void setPerson3(List<Person3> person3) { Person3 = person3; } /** * 映射单向的 N-1 * 使用注解 @ManyToOne 来进行映射 * 指定外键的名称 * @return */ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; }
}
//指定数据库的表名称
@Table(name = "JPA_PERSON3")
//指定持久化类
@Entity
public class Person3 {
private Integer pid ;
private String pname ;
private Date date;
private Orders3 orders3; @JoinColumn(name = "person3_pid") //进行设置懒加载 @ManyToOne(fetch = FetchType.LAZY) public Orders3 getOrders3() { return orders3; } public void setOrders3(Orders3 orders3) { this.orders3 = orders3; } @Id @GeneratedValue(strategy = GenerationType.IDENTITY) public Integer getPid() { return pid; } public void setPid(Integer pid) { this.pid = pid; } public String getPname() { return pname; } public void setPname(String pname) { this.pname = pname; } @Temporal(TemporalType.DATE) public Date getDate() { return date; } public void setDate(Date date) { this.date = date; }
}
---------测试
/**
*
*/
@Test
public void getVoid(){
//获取EntityManager对象
EntityManager entityManager = JPA_Util.getEntityManager();
//创建事务对象
EntityTransaction transaction = entityManager.getTransaction();
//开启事务
transaction.begin();
Person3 person = new Person3(); person.setPname("海绵宝宝"); person.setDate(new Date()); Person3 person2 = new Person3(); person2.setPname("派大星"); person2.setDate(new Date()); Orders3 orders = new Orders3(); orders.setName("双十一订单"); Orders3 orders2 = new Orders3(); orders2.setName("双十二订单"); //进行设置关联关系 person.setOrders3(orders); person2.setOrders3(orders2); //执行操作 entityManager.persist(person); entityManager.persist(person2); entityManager.persist(orders); entityManager.persist(orders2); //提交事务 transaction.commit(); //关闭 JPA_Util.getClose(); }