Hibernate映射详解(四)--一对一唯一外键关联映射

还记得多对一的那个例子吗?用户与组。我们在多的一端维护关系,最后生成的表格中,多的一端User中多出来一个字段groupId用来存储组的主键。这里,多个用户可以属于同一组。即在用户这个表中,groupId字段的值是可以重复的。但有的时候可能这个外键值是不可以重复的。比如仍然举身份证与人的例子。我们可以采用上面的一对一主键关联映射。当然,我们也可以在人的表中添加一个字段身份证id来存储信息。但只是这样还不够,不同的人拥有相同的身份证号码这是不允许的。那怎么办呢?一对一唯一外键映射来给我们解决这个问题。先来看一下图。

人与身份证的实体关系图

最后生成表关系图

下面来看具体代码的实现。

实体类实现:

public class Person {

privateintid;

private Stringname;

private IdCardidCard;//关联对象

省略getset方法

}

public class IdCard {

privateintid;

private StringcardNo;

省略getset方法

}

看一下映射文件

Person.hbm.xml

<hibernate-mapping>

<classname="com.bjpowernode.hibernate.Person"table="t_person">

<idname="id">

<generatorclass="native"/>

id>

<propertyname="name"/>

<many-to-onename="idCard"unique="true"/>

class>

hibernate-mapping>

IdCard.hbm.xml

<hibernate-mapping>

<classname="com.bjpowernode.hibernate.IdCard"table="t_idCard">

<idname="id">

<generatorclass="native"/>

id>

<propertyname="cardNo"/>

class>

hibernate-mapping>

普通的实体类映射。从上面可以看出,一对一唯一外键映射的重点就是Person一端的many-to-one标签的设定。同一对一主键关联映射一样,看完单向之后,我们来看一下一对一唯一外键映射的双向关联。同样拿人与身份证进行举例。

实体类实现

public class Person {

privateintid;

private Stringname;

private IdCardidCard;//关联属性

省略getset方法

}

public class IdCard {

privateintid;

private StringcardNo;

private Personperson;//关联属性

省略getset方法

}

对应的映射文件:

Person.hbm.xml

<hibernate-mapping>

<classname="com.bjpowernode.hibernate.Person"table="t_person">

<idname="id">

<generatorclass="native"/>

id>

<propertyname="name"/>

<many-to-onename="idCard"unique="true"/>

class>

hibernate-mapping>

IdCard.hbm.xml

<hibernate-mapping>

<class name="com.bjpowernode.hibernate.IdCard"table="t_idCard">

<idname="id">

<generatorclass="native"/>

id>

<propertyname="cardNo"/>

<one-to-onename="person"property-ref="idCard"/>

class>

hibernate-mapping>

一对一唯一外键关联映射双向采用标签映射,而且是必须指定。这也是在映射文件的实现上他们唯一的区别。

到现在为止,我们说了一对多,多对一,一对一,那剩下的估计大家也知道了。就是多对多。我们将在下一篇博客中介绍。

你可能感兴趣的:(Hibernate映射详解(四)--一对一唯一外键关联映射)