Hibernate多表的映射

一对多表的映射编写的配置文件
  
编写映射的配置文件 
        * 在多的一方:
            <many-to-one name="customer" class="cn.itcast.hibernate.demo4.Customer" column="cno"/>

        * 在一的一方:
            <set name="orders">
                <key column="cno"/>
                <one-to-many class="cn.itcast.hibernate.demo4.Order"/>
            </set>
    一对多表的级联保存( cascade="save-update"
      
级联保存效果
    * 级联保存:保存一方同时可以把关联的对象也保存到数据库中!!
    * 例如:现在只保存客户,那么默认订单也会保存到数据库中。
        * 注意:现在保存的是客户,所以需要在客户的映射文件中来加一个配置
            * <set name="orders" cascade="save-update">

    * 例如:保存订单,同时想级联客户的信息(即保存订单,也把客户信息保存到数据库中)
        * 注意:现在保存的订单,所以需要在订单的映射文件中添加一个配置
            * <many-to-one cascade="save-update" name="customer" class="cn.itcast.demo1.Customer" column="cno"/> 
    一对多表的级联删除( cascade="save-update,delete" )
     
 * 注意:如果使用级联删除时,不能使用托管状态对象的方式删除,手动创建的客户,客户下没有关联订单,所以订单不能删除。

    * 删除客户的时候,同时删除关联的订单
        * 注意1:先查询客户,再来删除客户,同时通过级联删除,会把该客户下所有的订单全部删除掉
        * 注意2:现在操作的是删除客户,所以需要在Customer.hbm.xml的配置文件中的<set>标签上添加cascade属性,值为delete
            * <set name="orders" cascade="save-update,delete">  出现多个值,使用逗号隔开即可。

    * 删除订单的时候,同时删除关联的客户(不常用,但是可以删除)
        * 删除订单的同时,级联删除客户。
        * 注意1:是在操作订单,所以需要在Order.hbm.xml的配置文件中<many-to-one>标签上添加cascade属性,即
            * <many-to-one cascade="save-update,delete" />

    一对多表的孤儿删除(注意只有一对多表中有孤儿删除)
 
 孤儿删除(孤子删除)
    * 在一对多的关系中,可以将一的一方认为是父方.将多的一方认为是子方.孤儿删除:在解除了父子关系的时候.将子方记录就直接删除。
    * 通俗的理解:如果配置了孤儿删除,再把订单的外键设置成null的同时,这条订单的记录也会同时删除掉!
    * 设置孤儿删除
        * 在Customer.hbm.xml中配置:<set name="orders" cascade="save-update,delete,delete-orphan">
        * 注意:演示的时候把Order.hbm.xml中<many-to-one cascade="save-update,delete" /> delete去掉,要不会产生级联删除。
  
级联的取值(cascade的取值)
 
* none                      -- 不使用级联
    * save-update               -- 级联保存或更新.
    * delete                    -- 级联删除.
    * delete-orphan             -- 孤儿删除.(注意:只能应用在一对多关系)
    * all                       -- 除了delete-orphan的所有情况.(包含save-update delete)
    * all-delete-orphan         -- 包含了delete-orphan的所有情况.(包含save-update delete delete-orphan)

  放弃外键的维护:
 
.如果不想产生多余的SQL语句,那么需要一方来放弃外键的维护!
    * 一般都是一的一方来放弃外键的维护!
    * 在<set>标签上配置一个inverse=”true”.true:放弃.false:不放弃.默认值是false
=============================================================================
多对多表的映射文件的配置

 
 配置多对多的映射
        * 先使用<set>标签描述集合,注意:必须要提供table属性,指的是中间表的名称。
        * 再配置<key>标签,column属性代表当前对象在中间表的外键名称。
        * 再配置<many-to-many>标签,class属性是集合中对象的全路径,column代表的是集合中对象在中间表的外键名称。

        * Student.hbm.xml
            <set name="courses" table="stu_cour">
                <!-- 当前对象在中间表的外键的名称. -->
                <key column="sno"/>

                <!-- 配置many-to-many -->
                <many-to-many class="cn.itcast.hibernate.demo5.Course" column="cno"/>
            </set>

        * Course.hbm.xml
            <!-- 配置学生的集合 -->
            <set name="students" table="stu_cour">
                <key column="cno"></key>
                <many-to-many class="cn.itcast.hibernate.demo5.Student" column="sno"/>
            </set>

    * 多对多进行双向关联的时候:必须有一方去放弃外键维护权.



























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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值