hibernate 映射关系 一对一

一对一  :
1.唯一外键关联

Person 类:
public  class  Person {
        private  Integer  id  ;
        private  String  name  ;
        private  PersonInfo  personInfo  ;
     ...
映射文件:
        < class  name = "Person"  >
              < id  name = "id"  >
                    < generator  class = "native"  ></ generator >
              </ id >
              < property  name = "name"  ></ property >
              < many-to-one  name = "personInfo"  class = "PersonInfo"  column = "personInfoId"  unique = "true" ></  many-to-one >
        </ class >


PersonInfo 类:
public  class  PersonInfo {
        private  Integer  id  ;
        private  String  info  ;
     ...
映射文件:
        < class  name = "PersonInfo"  >
              < id  name = "id"  >
                    < generator  class = "native"  ></ generator >
              </ id >
              < property  name = "info"  ></ property >
        </ class >

表结构:

person 表



personInfo 表

结论:
     从表结构看:
          person 表中有一个外键指向 personInfo 中某条数据,即实现了一对一
     从面相对象看:
          在Person 类中有 有一个 personInfo 属性(不是集合)及表明了一个 Person对象对应一个personInfo 对象

2.联合组建关联:
类文件不变;
映射文件:

        < class  name = "Person"  >
              < id  name = "id"  >
                    <!-- 
                   因为主键不是自己生成的,而是作为一个外键(来源于其它值),所以使用foreign生成策略 
                     foreign:使用另外一个相关联的对象的标识符,通常和<one-to-one>联合起来使用。 
                   再使用元素 <param>的属性值指定相关联对象(这里Person相关联的对象为PersonInfo,
                   则标识符为PersonInfo的id)为了能够在加载person数据同时加载PersonInfo数据,
                   所以需要使用一个标签<one-to-one>来设置这个功能。 
                    -->
                    < generator  class = "foreign"  >
                          <!-- 元素<param>属性name的值是固定为property -->
                          < param  name = "property"  > personInfo </  param >
                    </ generator >
              </ id >
              < property  name = "name"  ></ property >
              <!-- <one-to-one>标签 
            表示如何加载它的引用对象(这里引用对象就指idCard这里的name值是idCard),同时也说是一对一的关系。 
                   默认方式是根据主键加载(把person中的主键取出再到IdCard中来取相关IdCard数据。) 
                  我们也说过此主键也作为一个外键引用 了IdCard,所以需要加一个数据库限制(外键约束)constrained="true" 
                -->   
              < one-to-one  name = "personInfo"  constrained = "true"  ></ one-to-one >
        </ class >
.........
没有变化;
        < class  name = "PersonInfo"  >
              < id  name = "id"  >
                    < generator  class = "native"  ></ generator >
              </ id >
              < property  name = "info"  ></ property >
        </ class >

表结构:

person 表:


personInfo 表

person 表中的主键 可以看成是指向personInfo的外键。 及和personInfo 共享之间
但是在 有一点在存储 person 是 personInfo 必须有存在。

在person 的映射文件中 : < one-to-one  name = "personInfo"  constrained = "true"  ></ one-to-one >  中  constrained  属性为true表示 外键约束 表示该表的主键关联生成







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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值