当前位置: 首页 > 后端技术 > Java

记录一个班级和一个学生的关系修改成多对多关系的过程

时间:2023-04-02 00:18:22 Java

前言这周是alice项目的一个bug。由于重分类后原班没有学生,分析某门课在原班的表现也比较困难。不再。比如我以前在计算机1806班(计算机专业有9个班,分别是计算机1801-计算机1809)。由于大专业分小专业,所以我分到软件班181。如果班级和学生是一对有很多关系。此时计算机班1806没有学生,但成绩分析是对某班某门课程安排的成绩分析。需要获取本班所有学生的本次课程安排的成绩,导致成绩分析无法关联到所有学生。分数。解决方案一开始我觉得要改变实体之间的关系会很麻烦。我们要的是班上每个人的成绩数组。由于班里没有学生,所以查不到大家的成绩。但是大家的成绩还是保存在数据库里,没有丢失。我们就用另一种方法来查询吧。我在score_summary实体中添加了对应的score数组,这样就可以在不改变多对一的情况下满足需求。快要修改完的时候学长说班级管理里还是想看到原来班级的所有学生,只好把学生和班级的关系改成多对多。此时,你需要将班级和学生之间的一对多关系变成多对多关系。原来计算机班1806也可以找到分部前班级的所有学生。同时需要在班级和学生数组之间建立一对多的关系,表示该学生的当前班级。/***学生当前班级*/@ManyToOneprivateKlassklass;/***学生历史班级数组(包括当前班级)*/@ManyToMany(mappedBy="studentList")@JsonView(KlassListJsonView.class)privateListklassList=newArrayList<>();然后修改当前变更出现的问题。首先,由于student对于班级由多对一变为多对多,班级负责维护,数据库中自动建立了klass_student_list中间表。但是我们没有找到班级所有学生的数据,我们需要先恢复原班级的所有学生数据。当前班级的信息也保存在student中,我们利用这些数据将同班级的学生放入班级的student数组中。这样,中间表就有了相关的数据。ListklassList=this.klassRepository.findAll();ListallStudent=this.studentRepository.findAll();for(Klassklass:klassList){ListstudentList=newArrayList<>();}for(Studentstudent:allStudent){if(student.getKlass()!=null&&klass.getId().equals(student.getKlass().getId())){studentList.add(student);}}klass.setStudentList(studentList);}this.klassRepository.saveAll(klassList);然后在学生换课的时候修改代码。为了业务和技术分离,我们使用aop进行修改,也减少了对原有代码的改动。这个想法是,当学生更换班级时,该学生将从旧班级中删除,并将该学生添加到新班级中。@Before(value="annotationPointCut(id,student)",argNames="id,student")publicvoidbefore(Longid,Studentstudent){StudentnewStudent=this.studentService.findById(id);KlassoldKlass=newStudent.得到类();KlassnewKlass=this.klassService.findById(student.getKlass().getId());//如果新班级不等于旧班级if(!oldKlass.getId().equals(newKlass.getId())){//删除旧班级的这个学生inti=0;for(Studentstudent1:oldKlass.getStudentList()){if(student1.getId().equals(student.getId())){oldKlass.getStudentList().remove(i);}休息;}否则{i++;}}//将这个学生添加到新班级newKlass.getStudentList().add(newStudent);//保存this.klassService.save(oldKlass);这个.klassService.save(newKlass);}}但是我不知道在重新分配类的情况下如何操作。还需要和前辈们多多交流。我也需要用aop来修改这种情况。只需设置并添加新班级中的所有学生即可。可能出现的问题我在初始化班级所有学生数据时遇到了问题。更新后,中间表没有数据了。然后停下来查看问题,发现类不会添加到多对多查询类中。同学们都看这里,这就是hibernate的惰性查询机制。解决方案是关闭@ManyToMany@ManyToMany(fetch=FetchType.EAGER)privateListstudentList=newArrayList<>();上的延迟查询