一对一关系:
一对一的关系有一个先后和主次, 谁的电脑 (电脑 依赖 人),谁的书(书 依赖 人),哪儿的人(人 依赖 地区)。
这些都能够唯一确定一个主次的关系, 都是 从 依赖 主 而生。
所以 主从表的关系应该是:
主表,先有该表才能有从表的数据。
从表,引用主表的标识列。
所以 映射到实体类的设计时
主表 对应的类应该设计一个属性存放 从表对象,这个属性我们称为关系属性。
从表 对应的类应该设计一个属性存放 主表的对象。(关系属性)
所以 配置映射关系时:
<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 这样就重复了 就会出错。