一对唯一外键关联映射是采用多对一关联映射方法来解决一对一的问题,它就是多对一的一个特例。
       它是基于这样一种思想:在映射多的一端时采用<many-to-one>标签,并且用属性unique=true来限定它是唯一的,这样就实现了多的一端的多重性为一。但是,它仍保留多対一的痕迹(比如关系模型中增加一个外键字段)。
 
1.实体模型:
一对一唯一外键关联映射(单向)_hibernate
 
  此处单向是由person加载idcard,所以Person中要保存IdCard的对象。
 
2.关系模型:
一对一唯一外键关联映射(单向)_映射_02
 
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);
    }
  }
}