前一篇文章( Hibernate框架——关系操作(一))中编写了Hibernate的基本操作: 一对多单项关联,一对多双向关联。那么现Hibernate中的多对多的关联操作。
多对多的双向关联
Course 类
Student类
1. 一对多体现的是类与集合的关系
2. 多对一体现的是类与类之间的关系
3. 多对多体现的是类与集合之间的关系
Course.hbm.xml 配置文件中的set元素
Student.hbm.xml 配置文件中的set元素
关系维护
1. 建立关系,相当于在第三张表中插入一行数据。
2. 解除关系,相当于在第三张表中删除一行数据。
3. 重新建立关系,相当于先删除一行数据,再增加一行数据。
4. 多对多,谁维护关系效率都一样。
操作
让一个新的学生和一个已经存在的课程发生关联
|
|
说明:course.getStudents().add(student);是通过课程建立课程与学生之间的关联,执行course.getStudents()的时候,因为要查询该门课程中的所有学生,会发出根据课程查找该学生的SQL语句,这样做的效率比较低。
解除一个学生和一门课程之间的关系
|
|
解除该课程和这门课程所有的学生之间的关系
|
|
一个学生从一门课程转移到另外一门课程
|
|
一对一的双向
|
|
外键在student表中不能出现相同的值,外键是唯一的,所以是一对一的。
|
|
以上的代码是不对的,因为上面的代码会导致student1和student2的外键都是为6L,不符合外键也是唯一的约束了。
总结
1. 关系角度
一对多反映的是类与集合的关系
多对一反映的是类与类 之间的关系
多对多反映的是类与集合之间的关系
2. 一对多,多的一方维护关系,效率比较高
3. 多对多,谁维护效率都一样
4. 通过谁建立关系,就看谁的映射文件
5. Cascade 与inverse之间的区别(详见上面专门对Cascade与inverse的区别)