Hibernate one-to-many / many-to-one关系映射

现实世界的1对多(多对1)模型在Hibernate中的映射对应为one-to-many / many-to-one。本文通过举例对此加以说明。并附以详细实现代码。

现实生活中有很多1对多(多对1)的关系模型。比如,一个人可以有0到多套房子,0到多辆汽车;一个父亲有0到多个孩子等等。这种关系被称作1对多关系。 反过来,房子与人,汽车与人的关系,以及孩子与父亲的关系就是多对一的关系。这里需要注意一点的是,多对一关系的一个前提是:一套确定的房子只能属于某个 确定的人(不能属于多人);一个确定的孩子也只能属于某个确定的父亲。

下面我们就拿最简单的父亲和孩子的关系来说明1对多(多对1)模型在Hibernate中的映射。

关系模型:父亲 vs 孩子(Father vs  Son)。
Hibernate中对应的关系映射:one-to-many

反过来,

关系模型:孩子 vs 父亲(Son vs Father)。
Hibernate中对应的关系映射:many-to-one


很多初学者往往有这样的疑问,我什么时候需要定义映射关系呢?
答案很简单:按需求来确定。就是说你需要哪种关系的时候就定义哪种映射,不需要的时候就可以不定义它们的关系映射了。还是以上面的例子来说明。
如果你需要在取得孩子(Son)的时候,同时需要知道该孩子的父亲(Father)是谁,你就可以在孩子的映射定义文件Son.hbm.xml里定义孩子跟父亲的关系映射:many-to-one。
同样,如果需要知道某父亲的所有孩子,就可以在父亲的映射定义文件Father.hbm.xml里定义父亲跟孩子的关系映射:one-to-many。

# #  
# # father TABLE  
# #  
 CREATE TABLE FATHER (  
 ID CHAR(32) NOT NULL,  
 NAME CHAR(32) NOT NULL,  
 PRIMARY KEY(id)  
 )  
   
# #   
# # SON TABLE  
# #  
 CREATE TABLE SON (  
 ID CHAR(32) NOT NULL,  
 NAME CHAR(32) NOT NULL,  
 FATHER_ID CHAR(32) NOT NULL,  
 PRIMARY KEY(id)  
 )  
ALTER TABLE SON ADD FOREIGN KEY FATHER_ID REFERENCE FATHER(ID);

 Father.hbm.xml

<!-- FAHTER vs SON -->  
      <set name="sonSet" lazy="true" inverse="true">  
           <key>  
               <column name="FATHER_ID" not-null="true" />  
           </key>  
           <one-to-many class="com.yourcompany.entity.Son" />  
      </set>  

 Father.java

      /** sonSet: association with set */  
     private java.util.Set sonSet;  
    
      /** 
       * set sonSet 
       * @param sonSet association with set 
       */  
       public void setSonSet(java.util.Set sonSet) {  
           this.sonSet = sonSet;  
       }  
         
       /** 
        * get sonSet 
        * @return sonSet 
        */  
       public java.util.Set getSonSet() {  
           return sonSet;  
       }  

 Son.hbm.xml

          <!-- SON vs FATHER -->  
          <many-to-one  
              column="FATHER_ID"  
              name="father"  
              class="com.yourcompany.entity.Father"  
              not-null="true"  
              cascade="none" />  

 Son.java

  /** father: many-to-one association */  
     private com.yourcompany.entity.Father father;  

     /** 
      * set father 
      * @param father many-to-one association 
      */  
     public void setFather(com.yourcompany.entity.Father father) {  
         this.father = father;  
     }  
       
     /** 
      * get father 
      * @return father 
      */  
     public com.yourcompany.entity.Father getFather() {  
         return father;  
     }  

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值