说起一对一关联映射它有两种方式来实现。下面分别说一下它的两种不同的映射方式。
一、单项一对一关联映射
从图中,可以猜到这种一对一映射是通过两张表拥有相同的主键来进行关联的。只有在加载的时候,二条数据的主键相同就关联加载。
在这里,我们通过people来加载IDcard,进行一一对应。在设计实体类时,由于是根据people来加载IDcard,所以,我们应该在
people类中加入IDcard外键。
部分代码如下:
<!--people映射文件-->
<hibernate-mapping>
<class name="com.bjpowernode.hibernate.Person" table="t_person">
<id name="id">
<!-- 采用foreign生成策略,forgeign会取得关联对象的标识 -->
<generator class="foreign">
<!-- property只关联对象 -->
<param name="property">idCard</param>
</generator>
</id>
<property name="name"/>
<!--
one-to-one指示hibernate如何加载其关联对象,默认根据主键加载
也就是拿到关系字段值,根据对端的主键来加载关联对象
constrained="true表示,当前主键(person的主键)还是一个外键
参照了对端的主键(IdCard的主键),也就是会生成外键约束语句
-->
<one-to-one name="idCard" constrained="true"/>
</class>
</hibernate-mapping>
这里用到的是foreign生成策略,使得生成的主键和关联的属性的值一样。
constrained=”true表示,当前主键(person的主键)还是一个外键
标签不会生成额外的数据表字段。只是声明了一种一一对应关系
可以看出这样做有很大的弊端:扩展性极差。当我想要将二者的关系设计为一对多时,就要重新修改数据表了,这样会很麻烦的。
所以接下来看一下另外一种方式。
二、一对一唯一外键关联映射
这种方式是在people表中加入IDcard的外键,并约束外键唯一。这样也实现了一对一的映射。
部分代码:
<hibernate-mapping>
<class name="com.bjpowernode.hibernate.Person" table="t_person">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<many-to-one name="idCard" unique="true"/>
</class>
</hibernate-mapping>
这里通过unique="true"来约束外键的唯一性。
很明显,这种方式避免了很多弊端。它的可扩展性比前一种要好很多。
总结
综上所述,我们在设计一对一关联时,还是最好选择唯一外键进行约束,这样既实现了功能,扩展性也好。