Hibernate一对一 主键关联映射(one-to-one)

*两个对象之间是一对一的关系,如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>  




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值