• 【SSH进阶之路】Hibernate映射——一对一单向关联映射(五)


    【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代码  收藏代码
    1. <?xml version="1.0"?>  
    2. <!DOCTYPE hibernate-mapping PUBLIC   
    3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
    5. <hibernate-mapping package="com.liang.hibernate">  
    6.     <class name="Person" table="t_person">  
    7.         <id name="id">  
    8.         <!-- 采用foreign生成策略,forgeign会取得另外一个关联对象的标识 -->  
    9.             <generator class="foreign" >  
    10.                 <param name="property">idCard</param>  
    11.             </generator>  
    12.         </id>  
    13.         <property name="name"></property>  
    14.         <!--   
    15.             one-to-one指示hibernate如何加载其关联对象,默认根据主键加载  
    16.             也就是拿到关系字段值,根据对端的主键来加载关联对象  
    17.               
    18.             constrained="true"表示约束,当前主键(person的主键)还是一个外键  
    19.             参照了对端的主键(IdCard的主键),也就是会生成外键约束语句  
    20.          -->  
    21.          <!-- idCard属性,表达的是本对象与IdCard的一对一关系。 -->  
    22.         <one-to-one name="idCard" class="IdCard"  constrained="true"></one-to-one>  
    23.     </class>  
    24. </hibernate-mapping>  

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

    唯一外键关联:

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

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

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

    Html代码  收藏代码
    1. <!-- 采用<mang-to-one>标签来映射,指定多的一端unique为true,  
    2.     这样就限制了多的一端的多重性为一,就是这样来映射的。  
    3. -->  
    4. <many-to-one name="" unique="true"></many-to-one>  

    唯一外键的关系模型

    Person.hbm.xml

    Html代码  收藏代码
    1. <?xml version="1.0"?>  
    2. <!DOCTYPE hibernate-mapping PUBLIC   
    3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
    5. <hibernate-mapping package="com.liang.hibernate">  
    6.     <class name="Person" table="t_person">  
    7.         <id name="id">  
    8.             <generator class="native" ></generator>  
    9.         </id>  
    10.         <property name="name"></property>  
    11.         <!-- 由于它是一对一的唯一外键关联,它是多对一关联的特例,注释可以直接写成多对一关联-->  
    12.         <!-- idCard属性,表达的是本对象与IdCard的多对一关系。 -->  
    13.         <many-to-one name="idCard" class="IdCard" column="idCardId" unique="true"></many-to-one>      
    14.     </class>  
    15. </hibernate-mapping>  

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

    其他相同代码如下:

    Person

    Java代码  收藏代码
    1. public class Person {  
    2.     private int id;  
    3.     private String name;  
    4.     private IdCard idCard;  
    5.       
    6.     public IdCard getIdCard() {  
    7.         return idCard;  
    8.     }  
    9.     public void setIdCard(IdCard idCard) {  
    10.         this.idCard = idCard;  
    11.     }  
    12.     public int getId() {  
    13.         return id;  
    14.     }  
    15.     public void setId(int id) {  
    16.         this.id = id;  
    17.     }  
    18.     public String getName() {  
    19.         return name;  
    20.     }  
    21.     public void setName(String name) {  
    22.         this.name = name;  
    23.     }  
    24. }  

    IdCard

    Java代码  收藏代码
    1. public class IdCard {  
    2.     private int id;  
    3.     private String cardNo;  
    4.     public int getId() {  
    5.         return id;  
    6.     }  
    7.     public void setId(int id) {  
    8.         this.id = id;  
    9.     }  
    10.     public String getCardNo() {  
    11.         return cardNo;  
    12.     }  
    13.     public void setCardNo(String cardNo) {  
    14.         this.cardNo = cardNo;  
    15.     }  
    16. }  

    IdCard.hbm.xml

    Html代码  收藏代码
    1. <?xml version="1.0"?>  
    2. <!DOCTYPE hibernate-mapping PUBLIC   
    3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
    5. <hibernate-mapping package="com.liang.hibernate">  
    6.     <class name="IdCard" table="t_idCard">  
    7.         <id name="id">  
    8.             <generator class="native"></generator>  
    9.         </id>  
    10.         <property name="cardNo"></property>  
    11.     </class>  
    12. </hibernate-mapping>  

    建议

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

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

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

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

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

  • 相关阅读:
    iOS缓存
    哈希表
    查找
    基数排序
    归并排序
    快速排序
    redis 的高并发的理解
    springboot的理解
    使用maven命令安装jar包到本地仓库
    linux Centos7 安装docker步骤
  • 原文地址:https://www.cnblogs.com/Jeely/p/11957329.html
Copyright © 2020-2023  润新知