Hibernate 一对多 关联关系映射

维护关系为:一指向多的关系,在加载一的时候可将多的一端数据自动加载
班级和学生就是一对多的关系

单向关联

学生端:

    <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是设置此字段作为本表的外键

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值