首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

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

2012-10-09 
Hibernate one-to-many / many-to-one关系映射现实世界的1对多(多对1)模型在Hibernate中的映射对应为one-t

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 />        </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"                               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;       }  

?

热点排行