常用的是共享主键策略来完成一对一关系的映射
User类的映射文件User.hbm.xml
<hibernate-mapping package="alan.hbn.rel.o2o">
<class name="User" table="user_o2o_pk">
<id name="userId" column="userid">
<generator class="identity"/>
<!--标明主键采取自增列方式生成-->
</id>
<property name="userName" column="username"/>
<one-to-one name="address" class="Address" cascade="all"/>
<!--
标明一对一的关系在本类中的另一类的属性和类型,以及级连操作的范围
name属性标明User类中的Address类的对象名,class标明其类型
-->
</class>
</hibernate-mapping>
Address类的映射文件Address.hbm.xml
<hibernate-mapping package="alan.hbn.rel.o2o">
<class name="Address" table="address_o2o_pk">
<id name="addressId" column="addressid">
<generator class="foreign">
<!--标明主键采用共享主键策略-->
<param name="property">user</param>
<!--标明是引用自那个关联类的主键-->
</generator>
</id>
<property name="street" column="street"/>
<property name="zipcode" column="zipcode"/>
<one-to-one name="user" class="User" constrained="true"/>
<!--
标明一对一的关系在本类中的另一类的属性和类型,以及级连操作的范围
name属性标明Address类中的User类的对象名,class标明其类型,
constrained的属性关联是采取外键引用并作为主键,在采取共享主键时,
<generator class="foreign">和<one-to-one ....constrained="true">
是同时存在的
-->
</class>
</hibernate-mapping>
外键策略来完成一对一关系的映射
User类的映射文件User.hbm.xml
<hibernate-mapping package="alan.hbn.rel.o2o">
<class name="User" table="user_o2o_pk">
<id name="userId" column="userid">
<generator class="identity"/>
<!--标明主键采取自增列方式生成-->
</id>
<property name="userName" column="username"/>
<one-to-one name="address" class="Address" cascade="all"/>
<!--
标明一对一的关系在本类中的另一类的属性和类型,以及级连操作的范围
name属性标明User类中的Address类的对象名,class标明其类型
-->
</class>
</hibernate-mapping>
Address类的映射文件Address.hbm.xml
<hibernate-mapping package="alan.hbn.rel.o2o">
<class name="Address" table="address_o2o_pk">
<id name="addressId" column="addressid">
<generator class=" identity "/>
<!--标明主键采用自增列策略-->
</id>
<property name="street" column="street"/>
<property name="zipcode" column="zipcode"/>
<many-to-one name="user"
class="User"
column="userid"
cascade="all"
unique="true"/>
<!--
这里的<many-to-one>是做外键引用策略使用的并不是Address和User类是个一对多的关系,但是可以通过这对这种一对多关系加上特殊的约束来表示一对一的关系,也就是每一个User类的对象制等对应一个Address类的对象,就可以在表里对User和Address一对多关系的外键上作文章,当一个User类对象对应多个Address类对象的时候,address表中的对应user表中的外键就有多条是相同的,只要强制这个外键是唯一的就可以达到一对一关系的目标了
-->
</class>
</hibernate-mapping>