疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Hibernate一对一 主键关联映射


 

*两个对象之间是一对一的关系,如Person-IdCard(人-身份证号)

*有两种策略可以实现一对一的关联映射

》主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应关系;数据库不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联

》唯一外键关联:外键关联本来是用于多对一的配置,但是如果加上唯一的限制之后,也可以用来表示一对一关联映射

1.主键关联映射(单向)

实例场景:人-->身份证号(Person-->IdCard),从IdCard看不到Person对象

对象模型:

 

IdCard实体类:

  1. public class IdCard {  
  2.     private int id;   
  3.     private String cardNo;  
  4.  
  5.     public int getId() {  
  6.         return id;  
  7.     }  
  8.     public void setId(int id) {  
  9.         this.id = id;  
  10.     }  
  11.     public String getCardNo() {  
  12.         return cardNo;  
  13.     }  
  14.     public void setCardNo(String cardNo) {  
  15.         this.cardNo = cardNo;  
  16.     }  
  17. }  

Person实体类:

  1. public class Person {  
  2.     private int id;   
  3.     private String name;      
  4.     private IdCard idCard;//持有IdCard对象的引用  
  5.     public int getId() {  
  6.         return id;  
  7.     }  
  8.     public void setId(int id) {  
  9.         this.id = id;  
  10.     }  
  11.     public String getName() {  
  12.         return name;  
  13.     }  
  14.     public void setName(String name) {  
  15.         this.name = name;  
  16.     }  
  17.     public IdCard getIdCard() {  
  18.         return idCard;  
  19.     }  
  20.     public void setIdCard(IdCard idCard) {  
  21.         this.idCard = idCard;  
  22.     }  
  23. }  

IdCard实体映射文件:

  1. <hibernate-mapping>  
  2.     <class name="com.cn.hibernate.IdCard" table="t_idcard">  
  3.         <id name="id" column="id">  
  4.             <generator class="native"/>  
  5.         </id>  
  6.         <property name="cardNo"/>  
  7.     </class>  
  8. </hibernate-mapping>  

Person实体映射文件:

  1. <hibernate-mapping>  
  2.     <class name="com.cn.hibernate.Person" table="t_person">  
  3.         <id name="id" column="id">  
  4.             <!--  
  5.                 因为主键不是自己生成的,而是作为一个外键(来源于其它值),所以使用foreign生成策略  
  6.                 foreign:使用另外一个相关联的对象的标识符,通常和<one-to-one>联合起来使用。  
  7.                 再使用元素<param>的属性值指定相关联对象(这里Person相关联的对象为idCard,则标识符为idCard的id)为了能够在加载person数据同时加载IdCard数据,所以需要使用一个标签<one-to-one>来设置这个功能。  
  8.              -->  
  9.             <generator class="foreign">  
  10.                 <!-- 元素<param>属性name的值是固定为property -->  
  11.                 <param name="property">idCard</param>  
  12.             </generator>  
  13.         </id>  
  14.         <property name="name"/>  
  15.         <!-- <one-to-one>标签  
  16.         表示如何加载它的引用对象(这里引用对象就指idCard这里的name值是idCard),同时也说是一对一的关系。  
  17.         默认方式是根据主键加载(把person中的主键取出再到IdCard中来取相关IdCard数据。)  
  18.  我们也说过此主键也作为一个外键引用 了IdCard,所以需要加一个数据库限制(外键约束)constrained="true" 
  19.          -->  
  20.         <one-to-one name="idCard" constrained="true"/>    
  21. </class>  
  22. </hibernate-mapping>