您的位置:首页 > 其它

ssh学习:hibernate关系映射(5)

2016-02-16 11:45 302 查看
 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>

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: