一对一关联包括两种类型:
(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对象。