@ManyToMany的学习
Posted czrb
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了@ManyToMany的学习相关的知识,希望对你有一定的参考价值。
新建了一个manyToMany的学生-课程表,学生可以选择多个课程,多个课程可以被学生选。尝试如下代码,创建了两个list,然后新建对象,加入list,然后set《list》,报错,这是因为new的新对象
都是暂时的,米有加入。但在这样会生成一个中间表,虽然此时保存了course,中间表需要student,而student是暂时对象,所以报错。
数据库如图:
student中啥也没有。因为没有保存,是暂时对象
错误代码:
student:
@ManyToMany
private List<Course> courses;
--------------------------------------
course:
@ManyToMany
private List<Student> students;
----------------------------------
测试代码:
List<Course> courses=new ArrayList<>();
List<Student> students=new ArrayList<>();
------------------------------------------
Student student01=new Student();
student01.setStudentName("student01");
students.add(student01);
Course course01=new Course();
course01.setCourseName("Course01");
courses.add(course01);
student01.setCourses(courses);
course01.setStudents(students);
this.courseDao.save(course01);
this.studentDao.save(student01);
-------------------------------------------------------------------------------------------------------------------------------------------------------
这时候我加入了两个1.mappedB,用在被维护端,这里的course作为被维护端,student作为维护端,在这里用jointable,测试还是上面的方法,没有动,然后就student和course都成功了
这时候你也可以指定在jointable中name指定表名,然后指定外键,joinColumns是主操作表的中间表列,可以有好几个,而inverseJoinColumns是副操作表的中间表列,也就是student作为主操作表,
然后course作为父操作表,我尝试改过@JoinColumn(name="student_ID")变成@JoinColumn(name="student_ID~"),然后中间表就生不成了。
@JoinTable(name="studentsWcourse",
joinColumns={@JoinColumn(name="student_ID")},
inverseJoinColumns={@JoinColumn(name="course_ID")})
-----------------------------
student:
@ManyToMany()
@JoinTable()//创建了中间表
private List<Course> courses;
-----------------------------
course:
@ManyToMany(mappedBy = "courses")//被维护端
--------------------------------------------------------------------------------------------------------------------------------------------------------
在之后我在测试中,注释了student的保存的save方法,留着course的save,于是可以运行成功,course保存,然后student还是空表,当然student-cours也是空表,数据库的默认中间表是这样的,
谁作为维护,谁在前,比如这里的中间表是student。
this.courseDao.save(course01);
this.courseDao.save(course02);
// this.studentDao.save(student01);
// this.studentDao.save(student02);
-------------------------------------------------------------------------------------------------------------------------------------------------------
然后就是增删改查的操作了,findByStudent_name是我自己写的一个@Query函数,可以用id查。emm~写个删吧
删--------------------------------
Student student01=this.studentDao.findByStudent_name("student01");
Course course01=this.courseDao.findByCourse_name("course01");
this.studentDao.delete(student01);
this.courseDao.delete(course01);
System.out.println("HHHHHHHHHH删除成功");
-------------------------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------------------------------
多对多的关系是靠第三表来维护的,所以不建议执行级联删除操作,可以直接修改第三表实现,比如student和course,
如果出现学生不选这门课程了,或者学生修改了其他的,是对中间表的操作,比如这里有俩学生,俩课程。如果是全选,也就是
2*2=4,中间表中有四条记录,那么修改的时候就只需要增删改查中间表就可以修改学生对应的选课。下面有个增的例子
------------------------
List<Student> students=new ArrayList<>(); Student student01=new Student(); student01.setStudentName("student01"); students.add(student01); Course course01=this.courseDao.findByCourse_name("Course01"); List<Course> courses=new ArrayList<>(); courses.add(course01); course01.setStudents(students); student01.setCourses(courses); this.courseDao.save(course01); this.studentDao.save(student01); System.out.println("HHHHHHHHHH新建成功");
-------------------------------------------------------------------------------------------------------------------------------------------------------
如果不喜欢这个,可以进行级联保存
以上是关于@ManyToMany的学习的主要内容,如果未能解决你的问题,请参考以下文章
为啥不能在 Django ManyToMany 字段上强制执行唯一性?
码农小汪-Hibernate学习8-hibernate关联关系注解表示@OneToMany mappedBy @ManyToMany @JoinTable
Django笔记七之ManyToMany和OneToOne介绍