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

  一对唯一外键关联映射是采用多对一关联映射方法来解决一对一的问题,它就是多对一的一个特例。
       它是基于这样一种思想:在映射多的一端时采用<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);  
    }  
  }  
}

http://yangfei520.blog.51cto.com/1041581/274199

你可能感兴趣的:(关联映射)