您的位置:首页 > 其它

Hibernate映射——一对一单向关联映射(五)

2017-01-13 00:16 483 查看
【SSH进阶之路】Hibernate基本原理(一) ,小编介绍了hibernate的基本原理以及它的核心,采用对象化的思维操作关系型数据库

【SSH进阶之路】Hibernate搭建开发环境+简单实例(二),小编搭建了基本Hibernate的开发环境,并做了一个简单实例,对它的基本原理有了一个理性的认识。

【SSH进阶之路】Hibernate基本映射(三),我们介绍了Hibernate的基本映射(即对一个实体进行映射)的相关概念,并给大家实现相关实例,比较简单。

【SSH进阶之路】Hibernate映射——多对一单向关联映射(四),我们介绍了多对一的关联映射,并详细了解说了,映射技巧,这篇我们依旧使用此映射技巧,帮助大家更好的理解。

 

      下面开始今天的愉快之旅。

 

映射原理

 

      两个实体对象之间是一对一的关联映射,即一个对象只能与另外唯一的一个对象相对应。例如:一个人(Person)只有一张身份证(IdCard)。我们看一下这个例子的对象模型,如下图所示:

 

对象模型

 

       


        从上图中可以看出:

        1、一个人只有一张身份证,唯一的一个身份证号,对象之间是一对一的关系;

        2、人(Person)持有身份证(IdCard)的引用,所以,两个对象关系维护由person端决定。

        从对象模型映射成关系模型,有两种方式:主键关联和唯一外键关联,我们继续看下面的内容。

 

分类: 

 

 主键关联:

 

        1、两个实体对象的主键一样,以表明它们之间的一一对应关系;

        2、不需要多余的外键字段来维护关系,仅通过主键来关联,即Person的主键要依赖IdCard的主键,他们共用一个主键值。

        以上两点恰与唯一外键关联相反。

 

 主键关联的关系模型



 Person.hbm.xml

[html] view
plain copy

 print?





<?xml version="1.0"?>  

<!DOCTYPE hibernate-mapping PUBLIC   

    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  

    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  

<hibernate-mapping package="com.liang.hibernate">  

    <class name="Person" table="t_person">  

        <id name="id">  

        <!-- 采用foreign生成策略,forgeign会取得另外一个关联对象的标识 -->  

            <generator class="foreign" >  

                <param name="property">idCard</param>  

            </generator>  

        </id>  

        <property name="name"></property>  

        <!--   

            one-to-one指示hibernate如何加载其关联对象,默认根据主键加载  

            也就是拿到关系字段值,根据对端的主键来加载关联对象  

              

            constrained="true"表示约束,当前主键(person的主键)还是一个外键  

            参照了对端的主键(IdCard的主键),也就是会生成外键约束语句  

         -->  

         <!-- idCard属性,表达的是本对象与IdCard的一对一关系。 -->  

        <one-to-one name="idCard" class="IdCard"  constrained="true"></one-to-one>  

    </class>  

</hibernate-mapping>  

生成的表结构以及测试数据:





 

唯一外键关联:

 

       1、两个实体对象用一个外键来关联,以表表明对象之间的关系。

       2、其实它是多对一关联映射的特例,多的一端加上唯一的限制之后,用来表示一对一的关联关系。

       所以它采用多对一的标签来映射,如下所示:

[html] view
plain copy

 print?





<!-- 采用<mang-to-one>标签来映射,指定多的一端unique为true,  

    这样就限制了多的一端的多重性为一,就是这样来映射的。  

-->  

<many-to-one name="" unique="true"></many-to-one>  

唯一外键的关系模型



Person.hbm.xml

[html] view
plain copy

 print?





<?xml version="1.0"?>  

<!DOCTYPE hibernate-mapping PUBLIC   

    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  

    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  

<hibernate-mapping package="com.liang.hibernate">  

    <class name="Person" table="t_person">  

        <id name="id">  

            <generator class="native" ></generator>  

        </id>  

        <property name="name"></property>  

        <!-- 由于它是一对一的唯一外键关联,它是多对一关联的特例,注释可以直接写成多对一关联-->  

        <!-- idCard属性,表达的是本对象与IdCard的多对一关系。 -->  

        <many-to-one name="idCard" class="IdCard" column="idCardId" unique="true"></many-to-one>      

    </class>  

</hibernate-mapping>  

生成的表结构以及测试数据:

 




 

其他相同代码如下:

Person

[java] view
plain copy

 print?





public class Person {  

    private int id;  

    private String name;  

    private IdCard idCard;  

      

    public IdCard getIdCard() {  

        return idCard;  

    }  

    public void setIdCard(IdCard idCard) {  

        this.idCard = idCard;  

    }  

    public int getId() {  

        return id;  

    }  

    public void setId(int id) {  

        this.id = id;  

    }  

    public String getName() {  

        return name;  

    }  

    public void setName(String name) {  

        this.name = name;  

    }  

}  

IdCard

[java] view
plain copy

 print?





public class IdCard {  

    private int id;  

    private String cardNo;  

    public int getId() {  

        return id;  

    }  

    public void setId(int id) {  

        this.id = id;  

    }  

    public String getCardNo() {  

        return cardNo;  

    }  

    public void setCardNo(String cardNo) {  

        this.cardNo = cardNo;  

    }  

}  

IdCard.hbm.xml

[html] view
plain copy

 print?





<?xml version="1.0"?>  

<!DOCTYPE hibernate-mapping PUBLIC   

    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  

    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  

<hibernate-mapping package="com.liang.hibernate">  

    <class name="IdCard" table="t_idCard">  

        <id name="id">  

            <generator class="native"></generator>  

        </id>  

        <property name="cardNo"></property>  

    </class>  

</hibernate-mapping>  

建议

 

由于一对一主键关联映射具有以下两个缺点:

      1、灵活性差,没有办法改成多对一关联映射,不能应变多变的需求;

      2、必须先保存关联对象IdCard,之后才能保持Person;

所以,在映射一对一单向关联映射时,我们采用唯一外键关联映射。

     下篇博文,我们介绍一对一双向关联映射,谢谢关注。

转载自:http://blog.csdn.net/jiuqiyuliang/article/details/40350515
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: