http://blog.csdn.net/wudiwo/article/details/8298621
多对一映射:在说一对一外键单向映射中,在“主”端维护的时候用的是 标签,里面添加的unique=”true” 属性来约束的。这里不添加unique属性的时候就变成多对一的映射关系了。
“主”端: 多的一端
<hibernate-mapping>
<class name="Student" table="t_student">
<id name="id">
<generator class="native">
</id>
<property name="name"/>
<many-to-one name="classes" column="id_classes" cascade="all" />// column 数据中的别名 cascade 表示级联关系 通常用在多对一 ,和多对多的映射中
</class>
</hibernate-mapping>
数据库表中有三个字段 id、name、id_class
“被”端: 一的一端
<hibernate-mapping>
<class name="Classes" table="t_calsses">
<id name="id">
<generator class="native">
</id>
<property name="name"/>
</class>
</hibernate-mapping>
一对多单向映射:多对一的映射关系是在多的一端进行维护的,一对多关系映射则由一端来维护这种关系。
“主”端:一的一端来维护这种关系 ,用set标签 在student的表中添加字段 class_id 来进行关联。
<hibernate-mapping>
<class name="Classes">
<id name="name">
<generator class="native">
</id>
<set name="students">
<key column="class_id"/> //class_id是这里应该写多的一端的外键字段,一定要与这个外键字段一致。在一的一端是没有这个字段的
<one-to-many class="Student"/>
</set>
</class>
</hibernate-mapping>
“被”端:
<hibernate-mapping>
<class name="Student" table="t_student">
<id name="id">
<generator class="native">
</id>
<property name="name">
//我认为应该在这里写上class_id字段吧?
</class>
</hibernate-mapping>
一对多关联映射利用了多对一关联映射原理:
多对一关联映射:在多的一端加入外键指向一的一端,他维护的关系是多指向一
一对多关联映射: 在多的一端加入外键指向一的一端,它维护的关系是一指向多
也就是说一对多和多对一的映射策略是一样的,只是站的角度不同。
在一的一端维护的关系的缺点: 如果经t_student 表里面的classes_id 字段设为非空,则无法保存。
一对多双向关联映射: 一对多双向就是在一对多单向的基础上,改变“被”端的.hbm.xml配置文件。
一端基本上不变只是通常要 在标签里面要添加属性 inverse=”true” 属性,这个属性是控制由哪端来维护关系的。如下:
<hibernate-mapping package="com.fony.hibernate">
<class name="Classes" table="t_classes">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="students" inverse="true" cascade="all">// inverse 为关联关系控制方向 设置为true只能从多端来维护关联关系,默认为false
<key column="classesid"/>
<one-to-many class="Student"/>
</set>
</class>
</hibernate-mapping>
多端:
<hiberante-mapping>
<class name="Student" table="t_student">
<id name="id">
<generator class="native">
</id>
<property name="name"/>
<many-to-one name="classes" column="classesid"/>
</class>
</hibernate-mapping>
t_student 表有三个字段: id 、name、classesid
一对多双向总结如下:
在一的一端的集合上使用<key>
,在对方表中加入一个外键指向一的一端。
在多的一端要采用<many-to-one>
标签
<key>
标签指定的外键字段必须和<many-to-one>
指定的外键字段一致,否则会引起字段的错误。
在“一”一端维护一对多的关联关系,hibernate会发多余的update语句,所有我们一般在多的一端来维护这种关系,因此通常在set 标签上添加inverse=“true” 属性来提高系统效率。