【hibernate】多对一,一对多关系

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” 属性来提高系统效率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值