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