主键关联和唯一主键

一对一关联映射有两种:一种是主键关联,一种是“唯一”外键关联。 
主键关联:原理是两张表的主键(ID)保持一致,在获取的时候根据两种表中的ID相同来作为关系判断的标准,这样的设计好处在于我们不用添加另外的字段来维护它们之间的关系。 
废话少说,看例子。 
在生活一对一的关系还“算”挺多的,比如人与自己的省份证,丈夫和妻子(当然是在符合中国国情的情况下)等等。 
第一步:建立两张表。 
TABLE:husband 
Sql代码   收藏代码
  1. create table husband(  
  2. h_id int primary key,  
  3. h_name varchar(20)  
  4. );  

TABLE:wife 
Sql代码   收藏代码
  1. create table wife(  
  2. w_id int primary key,  
  3. w_name varchar(20)  
  4. );  

注意:这两张表没有使用外键来关联它们。 
第二步:建立PO对象。 
JAVA PO :HusbandPO.java 
Java代码   收藏代码
  1. package com.lovo.po;  
  2. public class HusbandPO {  
  3.   private int id;  
  4.       
  5.   private String name;  
  6.       
  7.   private WifePO myWife; //注意包含了一个妻子对象  
  8.   
  9.   ... other getXX setXX ...  
  10. }  

JAVA PO :WifePO.java 
Java代码   收藏代码
  1. package com.lovo.po;  
  2. public class WifePO {  
  3.   private int id;  
  4.       
  5.   private String name;  
  6.       
  7.   private HusbandPO myHus; //注意包含了一个丈夫对象  
  8.   
  9.   ... other getXX setXX ...  
  10. }  

第三步:在XX.hbm.xml中配置PO对象属性与数据库表字段的映射。 
HusbandPO.hbm.xml 

Xml代码   收藏代码
  1.  <hibernate-mapping>  
  2.     <!-- 主控方 -->  
  3.     <class name="com.lovo.po.HusbandPO" table="husband">  
  4.         <id name="id" column="h_id" type="int">  
  5.             <generator class="increment"></generator>  
  6.         </id>  
  7.         <property name="name" column="h_name" type="string"></property>  
  8.         <!-- cascade的作用是当本身发生修改的时候,会级联的修改从表 -->  
  9.         <one-to-one name="myWife" class="com.lovo.po.WifePO" cascade="all"></one-to-one>  
  10.     </class>  
  11. </hibernate-mapping>  

WifePO.hbm.xml 

Xml代码   收藏代码
  1. <hibernate-mapping>  
  2. <class name="com.lovo.po.WifePO" table="wife" >  
  3.     <id name="id" column="w_id" type="int">  
  4.         <generator class="foreign">  
  5.             <!-- 引用husband表的主键 -->  
  6.             <param name="property">myHus</param>  
  7.         </generator>  
  8.     </id>  
  9.     <property name="name" column="w_name" type="string"></property>  
  10.     <one-to-one name="myHus" class="com.lovo.po.HusbandPO"  cascade="all"></one-to-one>   
  11. </class>  
  12. lt;/hibernate-mapping>  


唯一外键映射:记住是“唯一”,因为一对一是多对一的一种特例,且在hibernate-mapping中是利用<many-to-one>来表示,这个时候需要指明该标签的unique="true",这才算是一对一,否则就是多对一。 
例子还是使用上面的一一制夫妻关系。 
第一步:只需要在两张表的其中一张中加上一个外键,我这里在wife身上加(没有别的意思  )。 
TABLE:husband 
Sql代码   收藏代码
  1. create table husband(  
  2. h_id int primary key,  
  3. h_name varchar(20)  
  4. );  

TABLE:wife 
Sql代码   收藏代码
  1. create table wife(  
  2. w_id int primary key,  
  3. w_name varchar(20),  
  4. fk_hus_id int foreign key(fk_hus_id)   
  5. references husband(h_id)  
  6. );  

第二步:上面是写PO ,这里也不例外,不过PO对象没有改变过哈,这里不复写了。 
第三步:XX.hbm,xml配置,配置与上面有所区别,注意啦…… 
HusbandPO.hbm.xml 
Xml代码   收藏代码
  1. <hibernate-mapping>   
  2.     <class name="com.lovo.po.HusbandPO" table="husband">  
  3.         <id name="id" column="h_id" type="int">  
  4.             <generator class="increment"></generator>  
  5.         </id>  
  6.         <property name="name" column="h_name" type="string"></property>   
  7.         <one-to-one name="myWife" class="com.lovo.po.WifePO"  
  8.         property-ref="myHus" cascade="all"></one-to-one>  
  9.         <!-- property-ref 被关联到此外键的类中的对应属性的名字,若没指定,使用被关联类的主键.由于这里是唯一外键关联,所以一般要设置这里。(这里相当于是在说我妻子的老公是我,从而我妻子的结婚证编号和我的结婚证编号是一样的)  -->  
  10.     </class>  
  11. </hibernate-mapping>  


WifePO.hbm.xml 
Xml代码   收藏代码
  1. <hibernate-mapping>  
  2.     <class name="com.lovo.po.WifePO" table="wife" >  
  3.         <id name="id" column="w_id" type="int">  
  4.             <!-- 注意!这里的ID不在是引用husband表的ID了 -->  
  5.             <generator class="increment"></generator>  
  6.         </id>  
  7.         <property name="name" column="w_name" type="string"></property>  
  8.         <many-to-one name="myHus" class="com.lovo.po.HusbandPO"  cascade="all"  
  9.         unique="true" column="fk_hus_id"></many-to-one>   
  10.         <!-- 这里是要表示一对一所以“unique="true"”是不可缺少的。column指明数据库表的外键字段 -->  
  11.     </class>  
  12. </hibernate-mapping>  
2 
3 
分享到:   
评论
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值