维护关系为:一指向多的关系,在加载一的时候可将多的一端数据自动加载
班级和学生就是一对多的关系
单向关联 |
学生端:
<class name="com.bjpowernode.hibernate.Student" table="t_student" >
<id name="id">
<generator class="native" />
</id>
<property name="name" />
</class>
班级端:
<class name="com.bjpowernode.hibernate.Classes" table="t_classes" >
<id name="id">
<generator class="native" />
</id>
<property name="name" />
<set name="students">
<key column="classesid"/>
<one-to-many class="com.bjpowernode.hibernate.Student"/>
</set>
</class>
students是个集合,就用set;既然是集合,中肯定有东西,key表明classesid在Student作为外键
实现原理:
- 班级实体持有学生实体的set集合
实现方式:
- 在一的一端采用
<one-to-many>
标签 - 在一的一端采用
<key>
标签,添加外键 <key column="classesid"/>
表明classesid作为另外一张表的外键<one-to-many>
表明与另外一张表的关系为一对多,也即classesid在t_studnet表中作为外键
弊端:
- 因为多的一端student不知道classes的存在,也就是student没有维护和classes的关系,所以在保存student的时候外键关系字段是为null,如果将该关系字段设置为唯一,将无法保存数据
- 因为student不维护关系,而classes维护关系,classes就会发出多余的update语句维护classes和student的关系,这样加载classes的时候才可把classes对应的学生的外键填充
双向关联 |
student端
<class name="com.bjpowernode.hibernate.Student" table="t_student" >
<id name="id">
<generator class="native" />
</id>
<property name="name" />
<many-to-one name="classes" column="classesid" />
</class>
classes端
<class name="com.bjpowernode.hibernate.Classes" table="t_classes" >
<id name="id">
<generator class="native" />
</id>
<property name="name" />
<set name="students" inverse="true">
<key column="classesid"/>
<one-to-many class="com.bjpowernode.hibernate.Student"/>
</set>
</class>
出现一对多双向映射的原因:
- 主要解决一对多单向关联的弊端,而不是需求驱动的
实现原理:
- 在多的一段加入一个外键,一的一端设置控制反转,是一的一端失效,变为双向
实现方式:
- 在一的一端的集合上采用
<key>
标签,在多的一端加入一个外键 - 在多的一端采用
<many-to-one>
标签 - 在多的一端的中添加inverse属性,invers控制方向上的反转,只影响存储,即让多的一段失效,解决上面的不足,生成多余的update语句
<many-to-one>
和<key>
加入的字段保持一致- 表现所在表与另外一张表的关系为多对一,通过外键classesid关联起来
1>one-to-many 或 many-to-one或many-to-many都会在多的一端生成多余字段
2>区分<many-to-one>
标签中用column设置外键和<key>
设置外键的区别:key是设置当前所在表的一个键做外两外一张表的外键,column是设置此字段作为本表的外键