hibernate中,多对多的关联关系
诸多场景多会使用到多对多的关联关系。譬如:老师与学生之间
在hibernate中,两表之间没有直接的关联,所要要借助第三方表来确认两表之间的关系。
在持久化的实体对象当中,均使用集合类封装另一对象;
在Xxx.hbm.xml中:
集合的标签中创建一个第三方的表两边的表必须一致;
<key></key>子表签来声明外键字段名;
使用<many-to-many></many-to-many>子标签来实现多对多的关联关系,class属性指的是另一类路径,column属性指的是另一表的外键字段名,需要一致。
以老师与学生之前关系为实例:
Javabean持久化对象:
student类
public class Student {
private int id;
private String name;
private Set<Teacher> teachers;
//省去get/set方法
}
Teacher类
public class Teacher {
private int id;
private String name;
private Set<Student> students;
//省去get/set方法
}
student.hbm.xml配置:
<hibernate-mapping> <class name="com.usc.geowind.lilin.bean.manyToMany.Student" table="Student"> <!-- type指明当前字段的类型 name对应实体中的属性名 --> <id type="integer" name="id"> <!-- 提供ID自增的策略 native会根据数据库自行判断 --> <generator class="native" /> </id> <property name="name" column="name"></property> <!-- 不能直接指定两者之间的多对多的关联关系,则需要借助第三方来确认关系 --> <!-- table是建立两表之前的关系的第三方表 --> <set name="teachers" table="ST"> <!-- 外键 --> <key column="student_id"></key> <!-- 多对多的关联关系的标签 ,class指定的是类, column值是另外一方的外键字段名,需要一直 --> <many-to-many class="com.usc.geowind.lilin.bean.manyToMany.Teacher" column="teacher_id"></many-to-many> </set> </class> </hibernate-mapping>
teach.hbm.xml配置:
<hibernate-mapping> <class name="com.usc.geowind.lilin.bean.manyToMany.Teacher" table="Teacher"> <!-- type指明当前字段的类型 name对应实体中的属性名 --> <id type="integer" name="id"> <!-- 提供ID自增的策略 native会根据数据库自行判断 --> <generator class="native" /> </id> <property name="name" column="name"></property> <!-- 不能直接指定两者之间的多对多的关联关系,则需要借助第三方来确认关系 --> <!-- table是建立两表之前的关系的第三方表 两边必须使用同一张第三方表 --> <set name="students" table="ST"> <!-- 外键 --> <key column="teacher_id"></key> <!-- 多对多的关联关系的标签 ,class指定的是类, column值是另外一方的外键字段名,需要一致 --> <many-to-many class="com.usc.geowind.lilin.bean.manyToMany.Student" column="student_id"></many-to-many> </set> </class> </hibernate-mapping>
2.使用第三方实体来实现多对多的关联关系:
在两对象之间使用集合的方式封装对方实体,而在第三方的实体中应用这两实体。
在三者之间的关联关系:两者实体与第三方实体之间均是一对多的关联关系,第三方实体与这两者之间均是多对一的关联关系。
还是以老师学生之间的多对多的关联关系,一STB为第三方实体为例:
Student:
public class Student2 {
private int id;
private String name;
private Set<Teacher2> teachers;//另一对象
//省去get/set方法
}
Teacher:
public class Teacher2 {
private int id;
private String name;
private Set<Student2> students;//另一对象
//省去get/set方法
}
STB:
public class STB {
private int id;
private Student2 student;
private Teacher2 teacher;
//省去get/set方法
}
Xxx.hbm.xml配置:
Student.hbm.xml部分配置:
<set name="teachers" > <!-- 外键 --> <key column="student_id"></key> <!--与第三方实体是一对多关联关系 class 值指向第三方的实体 --> <one-to-many class="com.usc.geowind.lilin.bean.manyToMany.STB"/> </set>
Teacher.hbm.xml中部分配置:
<set name="students"> <!-- 外键 --> <key column="teacher_id"></key> <!-- 与第三方实体是一对多关联关系 class 值指向第三方的实体 --> <one-to-many class="com.usc.geowind.lilin.bean.manyToMany.STB" /> </set>
STB.hbm.xml:
<hibernate-mapping> <class name="com.usc.geowind.lilin.bean.manyToMany.STB" table="STB"> <!-- type指明当前字段的类型 name对应实体中的属性名 --> <id type="integer" name="id"> <!-- 提供ID自增的策略 native会根据数据库自行判断 --> <generator class="native" /> </id> <!--与两者之间均是多对一关联关系--> <many-to-one name="student" column="student_id"></many-to-one> <many-to-one name="teacher" column="teacher_id"></many-to-one> </class> </hibernate-mapping>