Hibernate 一对一关联映射(主键关联VS唯一外键关联)

来源:互联网 发布:通过手机网络定位 编辑:程序博客网 时间:2024/05/21 11:11

Hibernate 一对一关联映射(主键关联VS唯一外键关联)

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

    TABLE:wife 
    Sql代码
  • create table wife(   
  • w_id int primary key,   
  • w_name varchar(20)   
  • );  
    create table wife(w_id int primary key,w_name varchar(20));

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

    JAVA PO :WifePO.java 
    Java代码
  • package com.lovo.po;   
  • public class WifePO {   
  •   private int id;   
  •        
  •   private String name;   
  •        
  •   private HusbandPO myHus; //注意包含了一个丈夫对象   
  •   
  •   ... other getXX setXX ...   
  • }  
    package com.lovo.po;public class WifePO {  private int id;  private String name;  private HusbandPO myHus; //注意包含了一个丈夫对象  ... other getXX setXX ...}

    第三步:在XX.hbm.xml中配置PO对象属性与数据库表字段的映射。 
    HusbandPO.hbm.xml Xml代码
  •  <hibernate-mapping>  
  •     <!-- 主控方 -->  
  •     <class name="com.lovo.po.HusbandPO" table="husband">  
  •         <id name="id" column="h_id" type="int">  
  •             <generator class="increment"></generator>  
  •         </id>  
  •         <property name="name" column="h_name" type="string"></property>  
  •         <!-- cascade的作用是当本身发生修改的时候,会级联的修改从表 -->  
  •         <one-to-one name="myWife" class="com.lovo.po.WifePO" cascade="all"></one-to-one>  
  •     </class>  
  • </hibernate-mapping>  
     <hibernate-mapping><!-- 主控方 --><class name="com.lovo.po.HusbandPO" table="husband"><id name="id" column="h_id" type="int"><generator class="increment"></generator></id><property name="name" column="h_name" type="string"></property><!-- cascade的作用是当本身发生修改的时候,会级联的修改从表 --><one-to-one name="myWife" class="com.lovo.po.WifePO" cascade="all"></one-to-one></class></hibernate-mapping>

    WifePO.hbm.xml Xml代码
  • <hibernate-mapping>  
  • <class name="com.lovo.po.WifePO" table="wife" >  
  •     <id name="id" column="w_id" type="int">  
  •         <generator class="foreign">  
  •             <!-- 引用husband表的主键 -->  
  •             <param name="property">myHus</param>  
  •         </generator>  
  •     </id>  
  •     <property name="name" column="w_name" type="string"></property>  
  •     <one-to-one name="myHus" class="com.lovo.po.HusbandPO"  cascade="all"></one-to-one>    
  • </class>  
  • lt;/hibernate-mapping>  
     <hibernate-mapping><class name="com.lovo.po.WifePO" table="wife" ><id name="id" column="w_id" type="int"><generator class="foreign"><!-- 引用husband表的主键 --><param name="property">myHus</param></generator></id><property name="name" column="w_name" type="string"></property><one-to-one name="myHus" class="com.lovo.po.HusbandPO"  cascade="all"></one-to-one> </class></hibernate-mapping>
    唯一外键映射:记住是“唯一”,因为一对一是多对一的一种特例,且在hibernate-mapping中是利用<many-to-one>来表示,这个时候需要指明该标签的unique="true",这才算是一对一,否则就是多对一。 
    例子还是使用上面的一一制夫妻关系。 
    第一步:只需要在两张表的其中一张中加上一个外键,我这里在wife身上加(没有别的意思 )。 
    TABLE:husband 
    Sql代码
  • create table husband(   
  • h_id int primary key,   
  • h_name varchar(20)   
  • );  
    create table husband(h_id int primary key,h_name varchar(20));

    TABLE:wife 
    Sql代码
  • create table wife(   
  • w_id int primary key,   
  • w_name varchar(20),   
  • fk_hus_id int foreign key(fk_hus_id)    
  • references husband(h_id)   
  • );  
    create table wife(w_id int primary key,w_name varchar(20),fk_hus_id int foreign key(fk_hus_id) references husband(h_id));

    第二步:上面是写PO ,这里也不例外,不过PO对象没有改变过哈,这里不复写了。 
    第三步:XX.hbm,xml配置,配置与上面有所区别,注意啦…… 
    HusbandPO.hbm.xml 
    Xml代码
  • <hibernate-mapping>    
  •     <class name="com.lovo.po.HusbandPO" table="husband">  
  •         <id name="id" column="h_id" type="int">  
  •             <generator class="increment"></generator>  
  •         </id>  
  •         <property name="name" column="h_name" type="string"></property>    
  •         <one-to-one name="myWife" class="com.lovo.po.WifePO"  
  •         property-ref="myHus" cascade="all"></one-to-one>  
  •         <!-- property-ref 被关联到此外键的类中的对应属性的名字,若没指定,使用被关联类的主键.由于这里是唯一外键关联,所以一般要设置这里。(这里相当于是在说我妻子的老公是我,从而我妻子的结婚证编号和我的结婚证编号是一样的)  -->  
  •     </class>  
  • </hibernate-mapping>  
    <hibernate-mapping> <class name="com.lovo.po.HusbandPO" table="husband"><id name="id" column="h_id" type="int"><generator class="increment"></generator></id><property name="name" column="h_name" type="string"></property> <one-to-one name="myWife" class="com.lovo.po.WifePO"property-ref="myHus" cascade="all"></one-to-one><!-- property-ref 被关联到此外键的类中的对应属性的名字,若没指定,使用被关联类的主键.由于这里是唯一外键关联,所以一般要设置这里。(这里相当于是在说我妻子的老公是我,从而我妻子的结婚证编号和我的结婚证编号是一样的)  --></class></hibernate-mapping>
    WifePO.hbm.xml 
    Xml代码
  • <hibernate-mapping>  
  •     <class name="com.lovo.po.WifePO" table="wife" >  
  •         <id name="id" column="w_id" type="int">  
  •             <!-- 注意!这里的ID不在是引用husband表的ID了 -->  
  •             <generator class="increment"></generator>  
  •         </id>  
  •         <property name="name" column="w_name" type="string"></property>  
  •         <many-to-one name="myHus" class="com.lovo.po.HusbandPO"  cascade="all"  
  •         unique="true" column="fk_hus_id"></many-to-one>    
  •         <!-- 这里是要表示一对一所以“unique="true"”是不可缺少的。column指明数据库表的外键字段 -->  
  •     </class>  
  • </hibernate-mapping>  
  • 0 0
    原创粉丝点击