一对一关系映射 与 lazy

一对一关系:
 一对一的关系有一个先后和主次, 谁的电脑 (电脑 依赖 人),谁的书(书 依赖 人),哪儿的人(人 依赖 地区)。
 这些都能够唯一确定一个主次的关系, 都是  从 依赖 主 而生。
 
 所以 主从表的关系应该是:
  主表,先有该表才能有从表的数据。
  从表,引用主表的标识列。
 
 所以 映射到实体类的设计时
  主表 对应的类应该设计一个属性存放 从表对象,这个属性我们称为关系属性。
  从表 对应的类应该设计一个属性存放 主表的对象。(关系属性)
  
 所以 配置映射关系时:
  <one-to-one name="关系属性" class="关系对应的类" foreign-key="关系对应的主键">
   如果是 从表 要加入  constrained="true" 属性表明从表是 受 主表约束的。主表数据不存在则从表数据也要不存在。
   cascade = none  在 持久化操作 从表时  不能影响到主表。比如删除从表数据,不能同时删除主表的数据。
  
 lazy: 懒加载,默认为 true。即不立刻将关系属性加载。
  如果我们配置了 false ,当查询当前对象时,就会关联查询与它有关系的表。


  比如,部门 有 员工这个属性。 当lazy=false时,就会立刻将该部门下的所有员工都查到。

并封装进这个属性供我们后续使用。然而这样很耗费时间的,如果部门下的员工很多呢。。。


  而lazy=true ,则不会立即查询。当我们手动调用时  比如  dept.getEmps() 时,Hibernate才
  会进行加载,然而这个时候与 查询相关的 Session 不能关闭,否则就报错了。
  
人  身份证

public class Person{
 private Integer pId;
 private String name;
 private String age;
 private Integer gender;
 private IdCard idcard;  // 声明一个属性来存 关系对象
}
public class IdCard implements{
 private Integer cId;
 private String cNum;
 private Date startTime;
 private Date endTime;
 private Person person;  // 声明一个属性来存 关系对象
}
--------------------------------  xml  --------------------------------
<class="Person" table="person">
    <id>..
    <property>..
    <one-to-one name="idcard" cascade="all" class="org.itfuture.www.po.Idcard" foreign-key="cid"/>
</class>

<class="IdCard" table="idcard">
    <id name="cId" type="integer" column="cId">
        <generator class="foreign">
            <param name="property">person</param>      //引用该类中 person 对象中的 标识符属性
        </generator>
    </id>
    <property>..
    //身份证 受 人的约束,先有人 后 有身份证。  cascade=None  身份证作废但人的信息还是有效的
    <one-to-one name="person" cascade="none" class="Person" foreign-key="cId" constrained="true"/>
</class>

 

 

 

 

需要注意的是:

      无论是  一对一  一对多  多对一 还是 多对对关系

      我们在设计类和配置映射文件时,对于这些关系属性一定要慎重,如果我们将关系属性关联成为一个对象作为属性的话,我们在配置的时候就要直接配置该属性,而不能即存在一个外键引用又存在一个属性对象。

 

     比如,在员工与部门关系中。在员工属性设置时,员工表有一个外键 deptId 指向部门表的主键。

     在设计类的时候 ,我们要将这个属性 设计称为一个 类 属性即  dept 用于存储一条部门表的记录。

     而不能同时存在两个属性  deptId 和 dept ,这样在配置中我们就没法进行关联了。

     因为在关联时, dept 肯定用到了这个 deptId 这一列,表明该列已经配置了,这样我们就不能单独在配置一个

     属性,名叫  deptId  这样就重复了 就会出错。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值