Hibernate的映射关系总结

来源:互联网 发布:如何获取微博数据 编辑:程序博客网 时间:2024/05/22 22:43

多对一映射:在说一对一外键单向映射中,在“主”端维护的时候用的是<many-to-one> 标签,里面添加的unique="true" 属性来约束的。这里不添加unique属性的时候就变成多对一的映射关系了。

   “主”端: 多的一端  

[html] view plain copy
  1. <hibernate-mapping>  
  2. <class name="Student" table="t_student">  
  3.   <id name="id">  
  4.   <generator  class="native">  
  5.  </id>  
  6.  <property name="name"/>  
  7.  <many-to-one name="classes" column="id_classes"  cascade="all" />// column 数据中的别名 cascade 表示级联关系 通常用在多对一 ,和多对多的映射中  
  8. </class>  
  9. </hibernate-mapping>  
数据库表中有三个字段 id、name、id_class
“被”端: 一的一端

[html] view plain copy
  1. <hibernate-mapping>  
  2. <class name="Classes" table="t_calsses">  
  3.  <id name="id">  
  4.   <generator class="native">  
  5.   </id>  
  6. <property name="name"/>  
  7. </class>  
  8. </hibernate-mapping>  

一对多单向映射:多对一的映射关系是在多的一端进行维护的,一对多关系映射则由一端来维护这种关系。

“主”端:一的一端来维护这种关系 ,用set标签 在student的表中添加字段 class_id 来进行关联。

[html] view plain copy
  1. <hibernate-mapping>  
  2.  <class name="Classes">  
  3.     <id name="name">  
  4.         <generator class="native">  
  5.    </id>  
  6.     <set name="students">  
  7.     <key column="class_id"/>  
  8.     <one-to-many class="Student"/>  
  9.    </set>  
  10. </class>  
  11. </hibernate-mapping>  
“被”端:

[html] view plain copy
  1. <hibernate-mapping>  
  2.  <class name="Student" table="t_student">  
  3.  <id name="id">  
  4.  <generator class="native">  
  5.  </id>  
  6.   <property name="name">  
  7.  </class>  
  8.  </hibernate-mapping>  
一对多关联映射利用了多对一关联映射原理: 

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

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

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

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

[html] view plain copy
  1. <hibernate-mapping>  
  2.  <id name="id">  
  3.    <generator class="native"/>  
  4.  </id>  
  5.  <property name="name"/>  
  6.  <many-to-one name="classes" column="classesid"/>  
  7.   </class>  
  8. </hibernate-mapping>  


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

一端基本上不变只是通常要 在<set>标签里面要添加属性 inverse="true" 属性,这个属性是控制由哪端来维护关系的。如下:

[html] view plain copy
  1. <hibernate-mapping package="com.fony.hibernate">  
  2.     <class name="Classes" table="t_classes">  
  3.         <id name="id">  
  4.             <generator class="native"/>  
  5.         </id>  
  6.         <property name="name"/>  
  7.         <set name="students" inverse="true" cascade="all">// inverse 为关联关系控制方向 设置为true只能从多端来维护关联关系,默认为false  
  8.             <key column="classesid"/>  
  9.             <one-to-many class="Student"/>  
  10.         </set>  
  11.     </class>  
  12. </hibernate-mapping>  
 多端:  

[html] view plain copy
  1. <hiberante-mapping>  
  2. <class name="Student" table="t_student">  
  3.  <id name="id">  
  4.    <generator class="native">  
  5.  </id>  
  6.     <property name="name"/>  
  7.   <many-to-one name="classes" column="classesid"/>  
[html] view plain copy
  1. </class>  
[html] view plain copy
  1. </hibernate-mapping>  

t_student 表有三个字段: id 、name、classesid

一对多双向总结如下:

 在一一端的集合上使用<key>,在对方表中加入一个外键指向一一端。

 在多的一端要采用<many-to-one>标签

<key>标签指定的外键字段必须和<many-to-one>指定的外键字段一致,否则会引起字段的错误。

在“一”一端维护一对多的关联关系,hibernate会发多余的update语句,所有我们一般在多的一端来维护这种关系,因此通常在set 标签上添加inverse=“true” 属性来提高系统效率。

0 0
原创粉丝点击