更多JPA在框架开发
1 一对多案例(部门与员工)
1.1 实体类注解
package edu.kmust.entity;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
/**
* 部门实体类
* @author zhaoyuqiang
*
*/
@Entity
@Table(name="tb_depart")
public class Depart {
@Id
@Column(name="depart_id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long departId ;
@Column(name="depart_name")
private String departName ;
/*
* 一对多的配置
* targetEntity可以省略
* mappedBy代表放弃对外键的维护,其值是Staff实体类中的部门属性
* cascade : 级联操作
* fetch: 查询方式,不写默认延迟加载
* lazy: 延迟加载
* eager:立即加载
*/
@OneToMany(targetEntity=Staff.class,mappedBy="depart",cascade=CascadeType.ALL)
private Set<Staff> staffs = new HashSet<Staff>();
// 此处省略getter和setter方法
}
package edu.kmust.entity;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
/**
* 员工实体类
* @author zhaoyuqiang
*
*/
@Entity
@Table(name="tb_staff")
public class Staff {
@Id
@Column(name="staff_id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long staffId ;
@Column(name="staff_name")
private String staffName ;
/*
* 多对一的配置
* cascade : 级联操作,ALL表示级联添加、级联删除、级联更新等等
* fetch: 查询方式 ,不写默认延迟加载
* lazy: 延迟加载
* eager:立即加载
*/
@ManyToOne(targetEntity=Depart.class,cascade=CascadeType.ALL,fetch=FetchType.EAGER)
/*
* 维护外键
* JoinColumn :添加外键
* name : 外键名字
* referencedColumnName : 外键关联的表的主键
*/
@JoinColumn(name="foreign_departId",referencedColumnName="depart_id")
private Depart depart ;
// 此处省略getter和setter方法
}
1.2 级联添加、级联更新与级联删除
级联添加:
Staff staf = new Staff();
staf.setStaffName("于鲲");
Depart dept = new Depart();
dept.setDepartName("220实验室");
staf.setDepart(dept);
dept.getStaffs().add(staf);
em.persist(dept);
级联更新:
/**
* 级联更新
* 将某一员工从220实验室移动到110实验室
*/
Depart dept = em.find(Depart.class, 1L);
Staff staf = em.find(Staff.class, 3L);
dept.getStaffs().add(staf);
staf.setDepart(dept);
级联删除:(小心,最好不用)
/**
* 级联删除
* 删除部门的同时,删除该部门下的所有联系人
*/
Depart dept = em.find(Depart.class, 3L);
em.remove(dept);
2 多对多案例(学生与教师)
2.1 实体类注解
package edu.kmust.entity;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
@Entity
@Table(name="tb_teacher")
public class Teacher {
@Id
@Column(name="tea_id")
@GenericGenerator(name="uuid",strategy="uuid")
@GeneratedValue(generator="uuid")
private String teaId ;
@Column(name="tea_name")
private String teaName ;
/*
* 放弃第三张表的维护
* targetEntity : 可以省略
* fetch: 查询方式,不写默认延迟加载
* lazy: 延迟加载
* eager:立即加载
*/
@ManyToMany(targetEntity=Student.class,mappedBy="teachers",cascade=CascadeType.ALL)
private Set<Student> students = new HashSet<Student>();
//此处省略getter和setter
}
package edu.kmust.entity;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
@Entity
@Table(name="tb_student")
public class Student {
@Id
@Column(name="stu_id")
@GenericGenerator(name="uuid",strategy="uuid")
@GeneratedValue(generator="uuid")
private String stuId ;
@Column(name="stu_name")
private String stuName ;
/*
* 建立多对多的联系
* fetch: 查询方式,不写默认延迟加载
* lazy: 延迟加载
* eager:立即加载
*/
@ManyToMany(targetEntity=Teacher.class,cascade=CascadeType.ALL)
/*
* 需要维护中间表,需要用JoinTable创建中间表
* JoinTable:创建中间表
* name:中间表的表名
* joinColumns:
* name : 当前实体类在中间表中的外键名字
* referencedColumnName : 关联的表的主键字段名
* inverseJoinColumns: 另一个实体类
* name : 另一个实体类在中间表中的外键名字
* referencedColumnName : 关联的表的主键字段名
*/
@JoinTable(name="tb_student_teacher",
joinColumns= {@JoinColumn(name="foreign_student_id",referencedColumnName="stu_id")},
inverseJoinColumns= {@JoinColumn(name="foreign_teacher_id",referencedColumnName="tea_id")}
)
private Set<Teacher> teachers = new HashSet<Teacher>();
//此处省略getter和setter方法
}
2.2 级联添加、级联删除与级联更新
级联添加:
Student stu = new Student();
Student stu1 = new Student();
stu.setStuName("张大科");
stu1.setStuName("赵玉强");
Teacher tea = new Teacher();
Teacher tea1 = new Teacher();
tea1.setTeaName("常璐璐");
tea.setTeaName("钱谦");
stu.getTeachers().add(tea);
stu1.getTeachers().add(tea);
stu1.getTeachers().add(tea1);
tea.getStudents().add(stu1);
tea.getStudents().add(stu);
tea1.getStudents().add(stu1);
em.persist(stu);
级联更新 :类似一对多,不再演示。
级联删除:(绝对禁止使用) , 不再演示。
3 多表查询
/**
* 1.对象图导航
* 默认是延迟查询
* 如果需要更改,需要对应实体类的配置多对一或者一对多或者多对多标签中加入
*
*/
Depart dept = em.find(Depart.class, 1L) ;
Set<Staff> stafList = dept.getStaffs();
for(Staff staf : stafList) {
System.out.println(staf.getStaffName());
其他查询类似一对多,多表中的特殊查询类似Hibernate中的多表查询。不再演示。
资源下载
JPA学习代码下载:
https://download.csdn.net/download/g425680992/10484800
Hibernate学习代码下载:
https://download.csdn.net/download/g425680992/10484797