【Hibernate步步为营】--单向关联一对一映射(一)
时间:2014-05-18 15:04:06
收藏:0
阅读:364
上篇文章对多对一的关联映射做了详细的分析,它在实现上可以有两种方式,并且这两种方式实现也很简单,关键是标签<many-to-one>的使用,它分别指明了多端和一端的映射关系,这种映射关系既是对象模型中的聚合关系。接下来继续讨论关联映射。
对比多对一关联映射和一对一唯一外键关联映射,其实它们两个都是使用了<many-to-one>本质上都是外键约束,只不过一对一的是唯一映射,需要添加unique="true"的属性,其它的它们两个是相同的。
Hibernate提供的这种映射关联中不但有<many-to-one>的关系,另外还提供了<one-to-one>的关系,它既是指一对一的关系。
在实现时需要将标识字段设置为foreign,并将需要关联的对象的名称作为property参数写入到构造器中,并在最后添加<one-to-one>标签。具体代码如下:
上面的示例中的<param name="property">idCard</param>指的是在Person.java中有一个idCard的属性,该属性是Person对象的一个关联对象,所以需要注册到foreign中,取得关联对象的标识。另外在<one-to-one>标签中添加了一个属性constrained="true",指示了Person对象的主键同时又是一个外键。具体的Person.java中的代码如下:
其中的idCard是Person对象的一个属性,所以在一对一主键关联映射时需要添加一个标识列。
一、唯一外键
唯一外键说的是数据库表中的每一行的外键唯一对应着另一张表中的主键,也就是说一个表的主键作为另一张表的外键,并且它们之间的关系是唯一的,这种反应到关系模型中如下图所示:
为了实现一对一的唯一外键映射,这时就必须在<many-to-one>标签中添加上属性unique,也就是指定多的一端的unique值为true,反应到该示例中也就是在person的映射文件中设置一个<many-to-one name="idCard">标签,并且标签中需要添加unique="true",所以对应的Person.java的映射文件Person.hbm.xml的代码如下:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2014-5-15 23:47:00 by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping> <class name="com.hibernate.Person" table="PERSON"> <id name="id" type="int"> <generator class="native"/> </id> <property name="name"></property> <many-to-one name="idCard" unique="true"></many-to-one> </class> </hibernate-mapping>
对比多对一关联映射和一对一唯一外键关联映射,其实它们两个都是使用了<many-to-one>本质上都是外键约束,只不过一对一的是唯一映射,需要添加unique="true"的属性,其它的它们两个是相同的。
二、主键关联映射
上文讨论了一对一的唯一外键映射,它其实是多对一关联映射的一种特殊情况,并且在关联映射中会有多种情况,这里再继续讨论关联映射可能的情况。
在一对一的关联映射中会有一种特殊的情况就是一个表的主键同时也是一个表的外键,也就是说一个字段是同是主键和外键,并且该外键唯一对应着另一张表的一行,它们两个是唯一对应的关系,反应到对象模型中它们之间属于一种一对一的引用关系,一个对象的属性是另外一个对象的属性值,对象模型如下图所示:
Hibernate提供的这种映射关联中不但有<many-to-one>的关系,另外还提供了<one-to-one>的关系,它既是指一对一的关系。
在实现时需要将标识字段设置为foreign,并将需要关联的对象的名称作为property参数写入到构造器中,并在最后添加<one-to-one>标签。具体代码如下:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2014-5-15 23:47:00 by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping> <class name="com.hibernate.Person" table="PERSON"> <id name="id" type="int"> <!-- 采用foreign生成策略,foreign会取得关联对象的标识 --> <generator class="foreign"> <!-- property只关联对象 --> <param name="property">idCard</param> </generator> </id> <property name="name"></property> <!-- one-to-one标签指示Hibernate如何加载其关联对象,默认根据主键加载,也就是拿到关系字段值,根据对端的主键来加载关联对象 constrained=true表示当前主键(person的主键)还是一个外键,参照了对端的主键(IdCard的主键),也就是会生成外键约束语句 --> <one-to-one name="idCard" constrained="true"></one-to-one> </class> </hibernate-mapping>
上面的示例中的<param name="property">idCard</param>指的是在Person.java中有一个idCard的属性,该属性是Person对象的一个关联对象,所以需要注册到foreign中,取得关联对象的标识。另外在<one-to-one>标签中添加了一个属性constrained="true",指示了Person对象的主键同时又是一个外键。具体的Person.java中的代码如下:
package com.hibernate; public class Person { private IdCard idCard; public IdCard getIdCard() { return idCard; } public void setIdCard(IdCard idCard) { this.idCard = idCard; } private int id; public int getId() { return id; } public void setId(int id) { this.id = id; } private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
其中的idCard是Person对象的一个属性,所以在一对一主键关联映射时需要添加一个标识列。
结语
上文介绍了两种一对一的映射,并且分别从对象模型和关系模型上进行了讨论,对于唯一外键的映射来说它是多对一映射的一种特殊情况,只需要在<many-to-one>中添加unique唯一键即可,另外还有唯一主键映射,这种其实需要<one-to-one>标签,然后在主键的属性中使用foreign生成策略,并在该映射中添加对应的关联对象。一对一的映射是还有很多种情况,将会在接下来的文章中讨论。
评论(0)