我们在之前的博客中已经有讲到什么是Hibernate的对象关系映射。
在实现ORM功能的时候,主要用到的文件有:
实际上就是我们用的对象类。类里的属性被映射为表中的字段。
指定了映射类和数据库之前的关系。包括映射类和数据库表的对应关系。表字段和类属性类型的对应关系以及表字段和类属性名称的对应关系等。
指定与数据库连接时需要的连接信息。
通过之前从入门到精通(三)映射实体类 博客,应该都对上面的三个文件不陌生。那么本篇博客,我们还是基于这三个文件来具体看一下各个不同的映射关系都是怎么实现的。
首先,关系映射的种类如下:
也即是上面七种关系。本篇博客我们介绍一对一关联映射。
两个对象之间一对一的关系,举例Person-IdCard
一个人只能有一张身份证,一张身份证也只能对应一个人。也意味着在每个person对象中都会引用一个IdCard对象。在具体业务中,如果仅有person到IdCard的关联,或者仅有IDCard到Person的关联,就称之为单项关联。如果同时包含两种关联映射,则成为双向关联映射。
有两种策略可以实现:
即让两个对象有相同的主键值。以表明它们之间的一一对应关系。数据库表仅通过表的主键来维护,不需要额外的字段。
具体实现:
<hibernate-mapping>
<class name="com.example.hibernate.IdCard" table="t_idCard">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="com.example.hibernate.User" table="t_person">
<id name="id">
<!-- 采用foreign生成策略,它会取得关联对象的标识 -->
<generator class="foreign">
<!-- property 指的是关联的对象 -->
<param name="property">idCard</param>
</generator>
</id>
<property name="name"/>
<one-to-one name="idCard" constrained="true" />
</class>
</hibernate-mapping>
注意:假如当前需要将其变为一对多的时候,就无法操作了。因此它的扩展映射性并不好。通常会采用下面这种唯一外键关联的办法来解决问题。
采用标签来映射,指定多的一端unique为true,因为unique=true是指这个字段的值在这张表里不能重复,所有记录值都要唯一,所以这样就限制了多的一段的多重性为一。(实际上不加unique=true的限制,正好是用于多对一的配置)
具体实现:
<hibernate-mapping>
<class name="com.example.hibernate.Person" table="t_person">
<id name="id">
<generator class="native"/>
</id>
<!-- property指关联对象 -->
<property name="name"/>
<!-- 默认参考idCard的主键-->
<many-to-one name="idCard" unique="true"/>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="com.example.hibernate.IdCard" table="t_idCard">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
</class>
</hibernate-mapping>
备注:一对一唯一外键关联映射其实就是多对一的特例。
采用标签映射
<one-to-one name="person"/>
采用one - to-one>标签映射,并需指定其中的property-ref属性为关系字段的名称。
<one-to-one name="person"property-ref="idCard"/>
以上,我们就将Hibernate中非常重要的一对一的关联映射介绍完了。
下篇博客会继续总结关联映射的其他几种映射关系。