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();
}
京公网安备 11010502036488号