多对多映射是现实生活中最常见的映射,也是最容易理解的映射。废话少说,直接开始。
映射原理
不论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张做一个关联。用第三张表来解决可能会造成数据冗余的问题。
举例
一个学生(Student)对多个科目(Course),一门学科对多个学生。
分类
单向的多对多关联映射(单向Student--->Course)
关系模式
实例映射
Studdent.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hyxd.entity">
<class name="Student" table="t_student">
<id name="studentId" column="s_id">
<generator class="native"></generator>
</id>
<property name="studentName" type="string"></property>
<!--
多对多映射:
1. 映射的集合属性: “developers”
2. 集合属性,对应的中间表: “t_relation”
3. 外键字段: prjId
4. 外键字段,对应的中间表字段: did
5. 集合属性元素的类型
-->
<set name="course" table="t_relation" cascade="save-update">
<key column="s_id"></key>
<many-to-many column="c_id" class="Course"></many-to-many>
</set>
</class>
</hibernate-mapping>
Course.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hyxd.entity">
<class name="Course" table="t_course">
<id name="courseId" column="c_id">
<generator class="native"></generator>
</id>
<property name="courseName" type="string"></property>
</class>
</hibernate-mapping>
多对多关联映射,在实体类中,跟一对多关联映射一样,也是用集合来表示的。标签中用table属性重命名中间表名称,标签定义当前表的主键,用标签来关联另一张表。
双向多对多映射Course映射文件中也要映射Student的关系具体代码与Student的<Set></Set>中的一样,需要更改Set集合里面的属性和relation表的主键
多对多双向关系中,User和Role的映射文件相同,值得注意的是生成的中间表名称必须一样,生成中间表的字段必须一样。
总结
多对多关联映射到此就结束了,经过对一对多关联映射的学习,相对而言,多对多关联映射变得非常的简单了,非常像一对多关联映射的变体。