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>标签映射,而且是必须指定。这也是在映射文件的实现上他们唯一的区别。

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

posted @ 2012-05-25 12:37  转航  阅读(566)  评论(0编辑  收藏  举报