JPA开发(下)一(多)对多的配置与crud操作

更多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

猜你喜欢

转载自blog.csdn.net/g425680992/article/details/80725771