其实不管是什么映射,很关键的一点就是表之间是如何产生映射的。映射关系的产生,关键是在映射文件中配置的,用特定的标签产生特定的映射关系,多对多也不例外。多对多的映射关系,都是转换成多对一的关系,即新增了一个表,来存储两个表之间的关系。此处,我们举一个老师和学生的关系,关键来分析一下,两者是如何产生多对多的映射关系的。
先建立两个类:Teacher和Student
public class Teacher {
private int id;
private String name;
private Set<Student> students;
……//set/get方法
}
public class Student {
private int id;
private String name;
private Set<Teacher> teachers;
……//set/get方法
}
多对多关系的建立,在两个类中,首先要各自包含对方的属性,由于是多对多,所以是一个集合对象。这个是建立映射关系的基础。
然后就是对应的映射文件了:
Teacher.hbm.xml:
<hibernate-mapping package="com.suo.domain">
<class name="Teacher">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="students" table="teacher_student">
<key column="teacher_id"/>
<!--key是将Teacher类对应的表的主键,作为teacher_student表的一个外键,column只是起到一个命名的作用 -->
<many-to-many class="Student" column="student_id"/>
<!--many-to-many是将Student类对应的表的主键,作为teacher_student表的一个外键,column只是起到一个命名的作用-->
</set>
<!--
对set这个标签的初步理解:name指定了类中的属性的名字,table指定了这个属性要映射到的表 。
key标签指定了本类所对应表的主键,要作为table所指定表的一个外键,并且命名这个外键。
<many-to-many>标签指定了和本类产生多对多关系的类,并且指定了这个类所对应的表的主键作为在
table所指定表中的一个外键,并且命名这个外键
-->
</class>
</hibernate-mapping>
Student.hbm.xml:
<hibernate-mapping package="com.suo.domain">
<class name="Student">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="teachers" table="teacher_student">
<key column="student_id"/>
<many-to-many class="Teacher" column="teacher_id"/>
</set>
</class>
</hibernate-mapping>
由配置文件我们可以知道,这里建立的是一个双向的映射关系,即在两个映射文件中,都指定了对方的属性。没有主从表之分。需要理解的是,要在数据库中建立一个中间关系的表,如本例中的teacher_student表,只需要配置一个映射文件就行了。至于另一个文件也做了类似的配置,是因为要建立一个双向的关系,在查询的时候,就可以进行双向的查询。