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

映射原理

 

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

 

对象模型

 

       

        从上图中能够看出:java

        一、一我的只有一张身份证,惟一的一个身份证号,对象之间是一对一的关系;app

        二、人(Person)持有身份证(IdCard)的引用,因此,两个对象关系维护由person端决定。测试

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

 

分类: 

 

 主键关联:

 

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

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

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

 

 主键关联的关系模型xml

 Person.hbm.xmlhtm

[html] view plain copy

  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>  

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

 

惟一外键关联:

 

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

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

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

[html] view plain copy

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

惟一外键的关系模型

Person.hbm.xml

[html] view plain copy

  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] view plain copy

  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] view plain copy

  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] view plain copy

  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>  

建议

 

因为一对一主键关联映射具备如下两个缺点:

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

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

因此,在映射一对一单向关联映射时,咱们采用惟一外键关联映射。

相关文章
相关标签/搜索