一对一关联包括两种类型:

(1)主键关联

两张关联表通过主键形成一对一映射关系。

Hibernate中,通过one-to-one节点对一对一关系进行声明。

由于采用了主键关联方式,那么通过主键关联的两张表,其关联记录的主键值须保持同步,即意味着只需为一张表设定主键生成器,而另一张表的主键与之共享相同的主键值。在Hibernate中,我们可以通过“foreign”类型的主键生成器与外间共享主键值。

一张表的主键配置为

<generator class="native"/>

<one-to-one

   ...

   outer-join="false"/>

当outer-join为true时,当加载实例时,Hibernate通过left outer join将one-to-one关联的表同时读入,为false时,需要时才将关联数据加载(延迟加载)。

另一张表的主键配置为

<generator class="foreign">

   <param name="property">user</param>

</generator>

<one-to-one

   name="user"

   class="..."

   constrained="true"/>

user为此表对另一张表POJO类对象的引用。one-to-one节点的constrained属性必须设定为true,以告知Hibernate当前表主键上存在一个约束,当前表引用了user表的主键。

(2)惟一外键关联

惟一外键关联的一对一关系只是多对一关系的一个特例而已。使用many-to-one配置。

一张表包含的一个字段与另一张表的id字段相关联。

假设每个用户都从属于一个用户组。

在一方User配置many-to-one节点,形成的是一个单向关系,通过这一方可以获得与其对应的另一方对象。

<many-to-one

   ...name/class/column

   unique="true"/>

要实现双向的一对一关系,则需对另一方Group进行修改,为其增加一个User类型属性,并在配置文件中追加one-to-one配置。这样加载Group时也可以获取对应的User字段。

<one-to-one

   name/class...

   property-ref="group"/>

group为User类的字段,Group对象。