在java中,被关联的对象的多个实例是通过集合对象<set>来实现的,而数据库中则需要一张中间表来将多对多的关系转为一个对象到中间表的多对一,以及中间表到另一个对象的一对多来实现的。hibernate配置多对多关联时使用<many-to-many>元素,它需要作为<set>的子元素来使用。
举个栗子:学生选课程,学生与课程是多对多的关系。
在数据库中的表结构如下:
student(s_id,s_name,s_birth,s_sex)
score(s_id,c_id,s_score);
course(c_id,c_name);
JavaBean:
关系映射文件如下:
Student.hbm.xml
<hibernate-mapping package="beans">
<class name = "Student" table="student">
<id name = "id" column="s_id">
<generator class="assigned" />
</id>
<property name="name" column="s_name"></property>
<property name="birth" column="s_birth"></property>
<property name="sex" column="s_sex"></property>
<!-- score为中间表 inverse为true表示这一端不会维护关系 cascade表示级联策略 -->
<set name="courseSet" table="score" inverse="true" cascade="save-update">
<!-- key表示在连接表的时候选择连接的列 -->
<key column="s_id"></key>
<many-to-many class="Course" column="c_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
Course.hbm.xml
<hibernate-mapping package="beans">
<class name = "Course" table="course">
<id name = "cid" column="c_id">
<generator class="assigned" />
</id>
<property name="cname" column="c_name"></property>
<set name="studentSet" table="score" inverse="true" cascade="save-update" >
<key column="c_id"></key>
<many-to-many class="Student" column="s_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
查询一些学生的信息,及这些学生选的课程
结果: