一对一唯一外键关联映射(单向)

本文介绍了一对一唯一外键关联映射的概念及其在Hibernate中的实现方式,通过实例展示了如何使用多对一关联映射解决一对一的问题,并讨论了实体模型、关系模型、实体类、映射文件及测试方法。
  一对唯一外键关联映射是采用多对一关联映射方法来解决一对一的问题,它就是多对一的一个特例。
       它是基于这样一种思想:在映射多的一端时采用<many-to-one>标签,并且用属性unique=true来限定它是唯一的,这样就实现了多的一端的多重性为一。但是,它仍保留多対一的痕迹(比如关系模型中增加一个外键字段)。
 
1.实体模型:
 
  此处单向是由person加载idcard,所以Person中要保存IdCard的对象。
 
2.关系模型:
 
3.实体类:
  IdCard.java
public class IdCard { 
  private Integer id; 
  private String cardNo; 
    //一系列的getter.setter方法 
  @Override 
  public String toString() { 
    // TODO Auto-generated method stub 
    return "Idcard:" + cardNo; 
  } 
}
    Person.java
public class Person { 
  private Integer id; 
  private String name; 
  private IdCard idCard; 
  //一系列的setter.getter方法 
    
  @Override 
  public String toString() { 
    // TODO Auto-generated method stub 
    return "Person:" + name; 
  } 
}
 
4.映射文件:
  IdCard.hbm.xml
  <class name="com.sxt.hibernate.one2one.entity.IdCard" table="sxt_hibernate_idCard"> 
    <id name="id" length="4"> 
      <generator class="native"></generator> 
    </id> 
    <property name="cardNo" length="10"></property> 
  </class>
   Person.hbm.xml
  <class name="com.sxt.hibernate.one2one.entity.Person" table="sxt_hibernate_person"> 
    <id name="id" length="4"> 
      <generator class="native"></generator> 
    </id> 
    <property name="name" length="10"></property> 
    <!--many-to-one标签的含义,是在本表中增加外键指向另一端。    
      unique="true"含义,是本表的本字段加上唯一性约束. 
     
--> 
    <many-to-one name="idcard_id" unique="true"></many-to-one> 
  </class>
 
5.hibernate配置文件:
   参照上一篇。
 
6.测试方法:
  public static void main(String[] args) { 
    Session session = HibernateUtils.getSession(); 
    Transaction t = session.beginTransaction(); 

    try { 
      /** 
        * 测试插入操作 
        */
 
/*      IdCard idCard=new IdCard(); 
      idCard.setCardNo("1234567890"); 
        
      Person person=new Person(); 
      person.setIdCard(idCard); 
      //不能成功保存,会报错org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.sxt.hibernate.one2one.entity.IdCard 
      //因为idCard是transient状态 
      //要在<many-to-one>中加上cascade="save-update",或者是在session.save(person)之前session.save(idCard) 
      session.save(person);*/
 
        
/*      IdCard idCard=new IdCard(); 
      idCard.setCardNo("1234567890"); 
      session.save(idCard); 
        
      Person person=new Person(); 
      person.setName("张三"); 
      person.setIdCard(idCard); 

      session.save(person);*/
 
      /** 
        * 小结:一对一唯一外键关联是多対一关联的特例,它不会默认有cascade属性,因此save对象时要保证它的关联属性是持久化状态的或者手动设置cascade属性. 
        */
 

        
      /** 
        * 测试加载操作 
        */
 
      Person p=(Person)session.load(Person.class, 2); 
      System.out.println(p); 
      System.out.println(p.getIdCard()); 
      t.commit(); 
    } catch (HibernateException e) { 
      e.printStackTrace(); 
      t.rollback(); 
    } finally { 
      HibernateUtils.closeSession(session); 
    } 
  } 
}


     本文转自NightWolves 51CTO博客,原文链接:http://blog.51cto.com/yangfei520/274199,如需转载请自行联系原作者


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值