一对多表操作

简介: 一对多表操作

t_clas班级表

t_student学生表

1.entity实体类:Clas

package xh.domain;
import javax.persistence.*;
import java.util.List;
@Entity(name="t_class")
public class Clas {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int cid;
    private String cname;
    //表示一对多,一个班级有多个学生对象
    @OneToMany(mappedBy = "clas",fetch = FetchType.EAGER)
    private List<Student> list;
    public List<Student> getList() {
        return list;
    }
    public void setList(List<Student> list) {
        this.list = list;
    }
    public int getCid() {
        return cid;
    }
    public void setCid(int cid) {
        this.cid = cid;
    }
    public String getCname() {
        return cname;
    }
    public void setCname(String cname) {
        this.cname = cname;
    }
    public Clas() {
    }
    public Clas(int cid, String cname, List<Student> list) {
        this.cid = cid;
        this.cname = cname;
        this.list = list;
    }
    //
    //@Override
    //public String toString() {
    //    return "Clas{" +
    //            "cid=" + cid +
    //            ", cname='" + cname + '\'' +
    //            ", list=" + list +
    //            '}';
    //}
}

2.entity实体类:Student

package xh.domain;
import javax.persistence.*;
/*
    sid sname cid(外键列)
 */
@Entity(name = "t_student")//外键表。字表
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int sid;
    private String sname;
    //多对一,多个学生对象对应一个班级
    @ManyToOne
    //指定外键列,若name属性没添加,则默认clas
    @JoinColumn(name = "cid")
    private Clas clas;
    public Clas getClas() {
        return clas;
    }
    public void setClas(Clas clas) {
        this.clas = clas;
    }
    public int getSid() {
        return sid;
    }
    public void setSid(int sid) {
        this.sid = sid;
    }
    public String getSname() {
        return sname;
    }
    public void setSname(String sname) {
        this.sname = sname;
    }
    @Override
    public String toString() {
        return "Student{" +
                "sid=" + sid +
                ", sname='" + sname + '\'' +
                ", clas=" + clas.getCname() +
                '}';
    }
}
//clas.getCname()在学生对象中拿到学生所在的班级名,在这里可以不用操作,后面用到在调用

3.dao层资源库:ClasDao接口

public interface ClasDao extends JpaRepository<Clas,Integer> {
}

StudentDao接口

public interface StudentDao extends JpaRepository<Student,Integer> {
}


4.测试类


a.查询操作

4.1查询全部学生,所在的班级也随之一起显示

@Autowired
ClasDao clasDao;
@Autowired
StudentDao studentDao;
@Test
void findStudent(){
    List<Student> all = studentDao.findAll();
    for (Student student : all) {
        System.out.println(student.getSid()+"\t"+student.getSname()+"\t"+student.getClas().getCname());
    }
}

4.2查询班级,及班级内的同学

会遇到session问题:需要在@OneToMany注解中添加fetch = FetchType.EAGER CascadeType.ALL

@Test
    void findClas(){
        List<Clas> all = clasDao.findAll();
        for (Clas clas : all) {
            //System.out.println(clas.getCname());
            //把班级中的所有学生查询出来
            List<Student> list = clas.getList();
            for (Student student : list) {
                System.out.println(student.getClas().getCname()+"\t"+student.getSname());
            }
        }
    }


b.更新添加操作

4.3更新学生信息,并分配班级

@Test
    void updateStudent(){
        //小何同学与班级cid为1的关联
        Student student = new Student();
        student.setSid(2);
        student.setSname("小何");
        Clas clas = new Clas();
        clas.setCid(3);
        //将小何同学分配到cid为1的班级
        student.setClas(clas);
        studentDao.save(student);
    }


c.删除操作

删除班级:
        若班级没有被引用(主键表中的主键值没有被引用)
        若班级被引用
 删除学生:

删除班级:

  • 没有被引用的班级可以直接删除
    c语言班:没有学生
//删除操作
    /*
        删除班级:
            若班级没有被引用(主键表中的主键值没有被引用),直接删除
            若班级被引用
                1.级联删除:
                2.先断开主外键连接,再删除
                    步骤1.断开主外键连接,使用update将被引用的主键值设置为null
                    步骤2.执行删除操作
                        遇到问题:no session--》解决:添加一个拦截器,延长session的生命周期
        删除学生:直接删除就可,不需考虑外键因素
     */
    @Test
    void deleteClas(){
        clasDao.deleteById(4);
    }
  • 被引用的班级不能直接删除
    1.级联删除:删除班级的时候,级联操作学生(需要在@OneToMany注解中添加cascade = CascadeType.ALL

  • 原理:

    先进行查询—》在进行删除子表关联该班级的学生—》再去删除班级


//比如删除Vue班----》小何同学
    @Test
    void deleteClas(){
        clasDao.deleteById(3);
    }


目录
相关文章
|
关系型数据库 MySQL 数据库
SQLAlchemy关联表一对多关系的详解
SQLAlchemy关联表一对多关系的详解
|
SQL XML 数据格式
mybatis-关联关系&一对多关联&多对一关联&多对多
mybatis-关联关系&一对多关联&多对一关联&多对多
|
SQL 数据库 Python
根据外键倒查关联表
根据外键倒查关联表
|
Java 数据库
不设外键:用程序来实现表之间的关联
Association 相信有很多同学都有使用过Hibernate框架的开发经验,尽管现在开发人员对Hibernate的褒贬不一,我们暂且不谈这个话题。
1756 1
|
Java 数据库连接 关系型数据库
|
Java 数据库连接 关系型数据库
|
Java 数据库连接 关系型数据库