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"/>

<!--多对一关联,但是后面加一个unique唯一的限定,则确保了关联字段取值的唯一性 -->

<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"/>

<!--property-ref为关系字段的名称 -->

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

</class>

</hibernate-mapping>

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值