1对1关联关系映射

域模型

这里写图片描述

关系数据模型

  • 按照外键映射

  • 按照主键映射

基于外键映射的 1-1

  • 对于基于外键的1-1关联,其外键可以存放在任意一边,在需要存放外键一端,增加many-to-one元素。为many-to-one元素增加unique=“true” 属性来表示为1-1关联
 <many-to-one name="manLover" class="com.school.ManLover" unique="true" >
            <column name="man_id"></column>
       </many-to-one>
  • 另一端需要使用one-to-one元素,该元素使用 property-ref 属性指定使用被关联实体主键以外的字段作为关联字段
        <one-to-one name="womanLover" property-ref="manLover" class="com.school.WomanLover"> </one-to-one>

不使用 property-ref 属性的 sql

  select
        manlover0_.ID as ID1_1_1_,
        manlover0_.NAME as NAME2_1_1_,
        manlover0_.AGE as AGE3_1_1_,
        womanlover1_.ID as ID1_3_0_,
        womanlover1_.NAME as NAME2_3_0_,
        womanlover1_.AGE as AGE3_3_0_,
        womanlover1_.man_id as man_id4_3_0_ 
    from
        hibernate.MANLOVER manlover0_ 
    left outer join
        hibernate.WOMANLOVER womanlover1_ 
            on manlover0_.ID=womanlover1_.ID //注意这里
    where
        manlover0_.ID=?

使用 property-ref 属性的 sql

 select
        manlover0_.ID as ID1_1_1_,
        manlover0_.NAME as NAME2_1_1_,
        manlover0_.AGE as AGE3_1_1_,
        womanlover1_.ID as ID1_3_0_,
        womanlover1_.NAME as NAME2_3_0_,
        womanlover1_.AGE as AGE3_3_0_,
        womanlover1_.man_id as man_id4_3_0_ 
    from
        hibernate.MANLOVER manlover0_ 
    left outer join
        hibernate.WOMANLOVER womanlover1_ 
            on manlover0_.ID=womanlover1_.man_id //注意这里
    where
        manlover0_.ID=?

注意

  1. 在查询时,有外键的一方会使用延迟加载策略,但没有外键的一方,会用联表查询的方式,将相关的信息一并查出。不存在懒加载问题。
  2. 关于删除,依旧是cascade的设置。
  3. 为什么不使用两个外键。因为会出现如下问题:使情况复杂化
    这里写图片描述

基于主键映射的 1-1

  • 基于主键的映射策略:指一端的主键生成器使用 foreign 策略,表明根据”对方”的主键来生成自己的主键,自己并不能独立生成主键. <param> 子元素指定使用当前持久化类的哪个属性作为 “对方”
 <id name="id" type="int">
            <column name="ID" />
            <generator class="foreign" >
                <param name="property">manLover</param>
            </generator>
        </id>
  • 采用foreign主键生成器策略的一端增加 one-to-one 元素映射关联属性,其one-to-one属性还应增加 constrained=“true” 属性;另一端增加one-to-one元素映射关联属性。
      <one-to-one name="manLover" constrained="true" class="com.school.ManLover"></one-to-one>
  • constrained(约束):指定为当前持久化类对应的数据库表的主键添加一个外键约束,引用被关联的对象(“对方”)所对应的数据库表主键

注意

  1. 无论两个对象插入前后,都是先执行没有外键的那个。因为外键的生成需要依赖。
  2. 依旧是代理和联合查表的现象。和外键一对一一样。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值