天天看点

Hibernate 关系映射--多对一、一对多总结篇

上一篇总结了一对一映射的几种情况,这里总结一下多对一、和一对多的关系映射的几种情况。

多对一映射:在说一对一外键单向映射中,在“主”端维护的时候用的是<many-to-one> 标签,里面添加的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"/>
    <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>
 </hibernate-mapping>
           

一对多关联映射利用了多对一关联映射原理: 

       多对一关联映射:在多的一端加入外键指向一的一端,他维护的关系是多指向一

       一对多关联映射: 在多的一端加入外键指向一的一端,它维护的关系是一指向多

 也就是说一对多和多对一的映射策略是一样的,只是站的角度不同。  

 在一的一端维护的关系的缺点: 如果经t_student 表里面的classes_id 字段设为非空,则无法保存。

<hibernate-mapping>
 <id name="id">
   <generator class="native"/>
 </id>
 <property name="name"/>
 <many-to-one name="classes" column="classesid"/>
  </class>
</hibernate-mapping>
           

一对多双向关联映射: 一对多双向就是在一对多单向的基础上,改变“被”端的.hbm.xml配置文件。

一端基本上不变只是通常要 在<set>标签里面要添加属性 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” 属性来提高系统效率。