一对多表操作

简介: 一对多表操作

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);
    }


目录
相关文章
|
4月前
gorm 多对多关系 以及 关联的操作
gorm 多对多关系 以及 关联的操作
55 0
|
7月前
|
SQL XML 数据格式
mybatis-关联关系&一对多关联&多对一关联&多对多
mybatis-关联关系&一对多关联&多对一关联&多对多
|
8月前
|
关系型数据库 MySQL 数据库
SQLAlchemy关联表一对多关系的详解
SQLAlchemy关联表一对多关系的详解
|
8月前
|
SQL 数据库 Python
根据外键倒查关联表
根据外键倒查关联表
|
Java 数据库
不设外键:用程序来实现表之间的关联
Association 相信有很多同学都有使用过Hibernate框架的开发经验,尽管现在开发人员对Hibernate的褒贬不一,我们暂且不谈这个话题。
1712 1
举一个多对多关联的例子,并说明如何实现多对多关联映射
例如:商品和订单、学生和课程都是典型的多对多关系。可以在实体类上通过@ManyToMany注解配置多对多关联或者通过映射文件中的和标签配置多对多关联,但是实际项目开发中,很多时候都是将多对多关联映射转换成两个多对一关联映射来实现的。
1446 0
|
Java 数据库连接 关系型数据库
|
Java 数据库连接 关系型数据库
|
Java 数据库连接 关系型数据库