欢迎访问:我的个人网站
#建立多对多映射关系
之前已经了解了一对多的关系建立以及其操作,接下来接着总结多对多映射关系的建立,多对多映射关系的建立与一对多映射关系的建立类似,不同的是二者的实体都需要Set集合形式,并且映射文件也都需要使用many-to-many标签建立映射,除此之外,还需要建立第三张表并设置两个外键。下面按照步骤说明建立的过程
举例:一个学生可以分别有不同的老师授课,一名老师也可以给不同的学生授课。是一个多对多关系,下面的代码将依据该例展开。实体Teacher以及实体Student
####1.建立实体类
实体类的建立不再赘述,仅说明多对多关系建立时所需要注意的地方,在建立多对多映射关系的时候,实体Teacher与Student实体彼此之间需要建立映射,所以**在Teacher实体里面需指定一个存储Student对象的Set集合表示一个老师会教授多名学生。同样的,在Student实体里面也需要建立一个存储Teacher类型的Set集合来表示一个学生会有多名老师。如下:
对于实体的Set集合要记得new出来
学生实体:
private int id;
private String name;
private Set<Teacher> teacherSet = new HashSet<Teacher>();
老师实体:
private int id;
private String name;
Set<Student> studentSet = new HashSet<Student>();
####2.建立映射文件,
与一对一映射关系建立过程一致:设置“特殊”属性与表的主键对象,并对应普通属性。不同的地方在于需要设置set标签以及一些属性以建立映射关系,具体设置如下:
学生实体:
<hibernate-mapping>
<class name="com.bestbigkk.domain.Student" table="tb_student">
<id name="id" column="id">
<generator class="native"></generator>
</id>
<property name="name" column="name"></property>
<!--
name表示的是Student实体的哪个属性对应Teacher
table表示二者建立多对多关系所用的第三张表的名称
-->
<set name="teacherSet" table="tb_teacher_student" cascade="save-update">
<!--
key里面的column指的是当前实体在第三张表里面的外键
-->
<key column="_student"></key>
<!--
class指的是当前实体所对应的实体的全路径,
column指的是当前当前实体(Student)所对应实体(Teacher)的外键名称
-->
<many-to-many class="com.bestbigkk.domain.Teacher" column="_teacher"></many-to-many>
</set>
</class>
</hibernate-mapping>
老师实体:
<hibernate-mapping>
<class name="com.bestbigkk.domain.Teacher" table="tb_teacher">
<id name="id" column="id">
<generator class="native"></generator>
</id>
<property name="name" column="name"></property>
<set name="studentSet" table="tb_teacher_student" cascade="save-update">
<!--当前实体在第三张表里面所对应的外键名称-->
<key column="_teacher"></key>
<many-to-many class="com.bestbigkk.domain.Student" column="_student"></many-to-many>
</set>
</class>
</hibernate-mapping>
至此。多对多的映射关系也就建立完成,可以通过数据库查看映射的关系: