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

转载 2015年11月17日 20:50:27

映射原理

 

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

 

对象模型

 

       

        从上图中可以看出:

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

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

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

 

分类: 

 

 主键关联:

 

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

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

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

 

 主键关联的关系模型

 Person.hbm.xml

  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、其实它是多对一关联映射的特例,多的一端加上唯一的限制之后,用来表示一对一的关联关系

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

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

唯一外键的关系模型

Person.hbm.xml

  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

  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

  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

  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;

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


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

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

两个实体对象之间是一对一的关联映射,即一个对象只能与另外唯一的一个对象相对应。例如:一个人(Person)只有一张身份证(IdCard)。...
  • jiuqiyuliang
  • jiuqiyuliang
  • 2014年10月23日 08:15
  • 23790

【SSH进阶之路】Hibernate映射——一对一双向关联映射(六)

上篇博文【SSH进阶之路】Hibernate映射——一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证...
  • jiuqiyuliang
  • jiuqiyuliang
  • 2014年10月31日 08:39
  • 19323

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

基本映射是对一个实体进行映射,关联映射就是处理多个实体之间的关系,将关联关系映射到数据库中,所谓的关联关系在对象模型中有一个或多个引用。...
  • jiuqiyuliang
  • jiuqiyuliang
  • 2014年10月22日 08:15
  • 31427

【Hibernate】二、Hibernate映射详解(一对一单向关联)

Hibernate的目的就是让开发人员觉得好像是将JAVA对象存储到了数据库里一样。但是,我们知道数据库中只有表,如何将java对象经过Hibernate存储到数据库中,又如何将数据库中存储的数据通过...
  • u010902721
  • u010902721
  • 2016年09月29日 23:08
  • 2482

【Hibernate步步为营】--双向关联一对一映射详解(一)

一对一的映射在对象模型中是经常见到的,为了将对象模型转换为关系模型就必须在映射文件中进行配置,上篇文章讨论了一对一映射的单向关联的情况,重点是标签的使用,需要在映射的主对象中添加该标签,并将该对象的主...
  • zhang_xinxiu
  • zhang_xinxiu
  • 2014年05月19日 09:41
  • 5836

Hibernate 基于外键一对一映射(单双向)

主要内容: 映射关联关系 一对一关联映射的策略 基于外键的单(双)一对一关联映射 基于主键的单(双)一对一关联映射 基于外键的单向一对一实际上是多对一关联映射的特例 采用标签,指定多的一端的uniq...
  • lm709409753
  • lm709409753
  • 2016年04月01日 19:21
  • 914

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

还记得多对一的那个例子吗?用户与组。我们在多的一端维护关系,最后生成的表格中,多的一端User中多出来一个字段groupId用来存储组的主键。这里,多个用户可以属于同一组。即在用户这个表中,group...
  • wang_chaoju
  • wang_chaoju
  • 2015年02月10日 15:12
  • 706

【Hibernate步步为营】--单向关联一对一映射

在一对一的关联映射中会有一种特殊的情况就是一个表的主键同时也是一个表的外键,也就是说一个字段是同是主键和外键,并且该外键唯一对应着另一张表的一行,它们两个是唯一对应的关系,反应到对象模型中它们之间属于...
  • zhang_xinxiu
  • zhang_xinxiu
  • 2014年05月16日 08:52
  • 4777

【SSH进阶之路】Hibernate基本映射(三)

【SSH进阶之路】Hibernate基本原理(一) ,小编介绍了Hibernate的基本原理以及它的核心,采用对象化的思维操作关系型数据库。 【SSH进阶之路】Hibernate搭建开发环境+简单实例...
  • jiuqiyuliang
  • jiuqiyuliang
  • 2014年10月17日 08:19
  • 35855

【SSH系列】hibernate映射 -- 一对一双向关联映射

开篇前言      上篇博文【SSH进阶之路】hibernate映射——一对一单向关联映射,小编介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来...
  • u010850027
  • u010850027
  • 2016年06月20日 00:00
  • 4749
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【SSH进阶之路】Hibernate映射——一对一单向关联映射(五)
举报原因:
原因补充:

(最多只允许输入30个字)