一对一关联(包括两种类型)
1、主键关联
2、唯一外键关联
一个典型实例:中国公民只允许有一张身份证. 以T_User 和T_Idcard为例
T_User( id int <pk,fk2> ,
name varchar(50) ,
age int
) ;
T_Idcard(
id int <pk> ,
serial varchar(30) ,
expiry int
) ;
通过one-to-one节点进行声明
TUser.hbm.xml
<one-to-one name="idcard" 一对一映射节点
class="com.gjun.vo.Idcard"
cascade="all" 级联关系
/>
级联(cascade)在Hibernate关系中是个非常重要概念.它指的是当主控方执行操作时,关联对象(被控方)是否同步执行同一操作.
TIdcard.hbm.xml
<id name="id" column="id">
<generator class="foreign"> foreign主键生成
<param name="property">user</param>
</generator>
</id>
<one-to-one name="user" 一对一映射节点
class="com.gjun.vo.User"
constrained="tue" 约束
/>
---------------------------------------------------------------------------------------------------------------------------------------------------------
双向一对多关联
实例:一个用户拥有办公办公室地址,家庭地址等多个地址属性.
TUser.hbm.xml
<set name="addresses"
inverse="true" 控制方向反转
lazy="false" cascade="all">
<key column="user_id">
</key>
<one-to-many class="com.gjun.vo.Address"/>
</set>
TAddress.hbm.xml
<many-to-one name="user"
class="com.gjun.vo.User"
cascade="none"
column="user_id"
not-null="true"
/>
------------------------------------------------------------------------------------------------------------------------------------------------------------------
一对多双向自关联
同一个类既扮演了one的角色,又扮演了many的角色。典型的应用案例就是一个种类分层模型。
商品分类表(ProductType):
id int(11) <pk> ID号 -----自身外键参照
parent_id int(11) <fk> 父类ID号
cate_no varchar(50) 类别编码
cate_name varchar(50) 类别名称
实体类:
id : Integer
parent : ProductType
childs : Set
cateNo : String
cateName : String
<hibernate-mapping>
<class name="com.gjun.vo.ProductType" table="ProductType">
<id name="id" type="integer" column="ID">
<generator class="identity" />
</id>
<many-to-one name="parent"
column="PARENT_ID"
class="com.gjun.vo.ProductType"
lazy="false"/>
<set name="childs"
cascade="all"
lazy="false"
inerse="true">
<key column="PARENT_ID" />
<one-to-many class="com.gjun.vo.ProductType" />
</hibernate-mapping>