一对一关系的实现,其建表策略有两种:
1、唯一外键,是指一方引用另一方的主键,作为外键,并且对引用的外键加唯一约束。
2、共享主键,是指一方引用另一方的主键,作为自身的主键,也是外键。
一、通过实例说明唯一外键的方式映射双向一对一关系
Account和Address是一对一关系,有以下属性:
**Account: Address addr;
**Address:Account acct;
在映射文件Account.hbm.xml中,关系属性addr配置如下:
<one-to-one name="addr" cascade="all" property-ref="addr"/>
** property-ref表示外键所在的表对应的对象
在映射文件Address.hbm.xml中,关系属性acct配置如下:
<many-to-one name="acct" column="fid" unique="true" cascade="all"/>
**many-to-one 表示"关联属性"acct体现的是一对多(因为数据库中外键字段代表多),但是实际上acct代表一对一,因此添加unique="true" 的额外约束
**fid 代表表中的外键字段
**unique="true" 代表外键的唯一性
**cascade="all" 代表对任意数据库操作都执行"级联操作"
二、通过实例说明主键共享的方式实现双向一对一映射
同是以Account和Address一对一关系为例,有以下属性:
**Account: Address addr;
**Address:Account acct;
在映射文件Account.hbm.xml中,关系属性addr配置如下:
<one-to-one name="addr" cascade="all" />
在映射文件Address.hbm.xml中,关系属性acct主要配置如下:
<id name="oid"> <generator class="foreign"> <param name="property">acct</param> </generator> </id> <one-to-one name="acct" cascade="all" constrained="true"/>**Address的主键值由Account的主键值而来
** <generator class = "foreign">是指oid的值是由关联表的主键值而来。
** <param name="property">acct</param>是指关联表是acct 属性的类型所对应的表
** constrained="true" 是指acct属性所在类对应表的主键对应acct属性类型所对应的关联表的主键
以上只是个人点滴总结,出错处请大家指出,谢谢