甜咖啡

          我的IT空間

          Hibernate繼承關(guān)系映射

          類繼承關(guān)系映射
          (1)DB表之間不存在繼承關(guān)系,要把JavaBean中的繼承關(guān)系映射到關(guān)系數(shù)據(jù)庫中的有三種映射方式:
          ·每個(gè)類建一張表
          ·所有類建一張表
          ·只為具體類建表

          eg. 以公司Company(一方)和員工Employee(多方),Employee有兩個(gè)子:類小時(shí)工HourlyEmployee和正式員工SalariedEmployee


          1)每個(gè)類建一張表
          可以有效減少數(shù)據(jù)冗余,減少字段,查詢效率不很高。
          配置文件:
          Company.hbm.xml
          <class name="Company" table="company">
             <id name="oid" column="oid" >
                  <generator class="native">
                  </generator>
             </id>
             <property name="name" type="string"/>
             <!-- Company與Employee是多態(tài)關(guān)聯(lián),
              但是由于DB沒有描述Employee類和它的兩個(gè)子類的繼承關(guān)系,
              因此無法映射Company類的employees集合,
              所以該文件僅僅映射了Company的id和name屬性 -->
          </class>
          <一>:需要針對(duì)每個(gè)類寫映射配置文件,就和普通的單表映射的xml文件相同
          Employee.hbm.xml
          <class name="Employee" table="employee">
             <id name="oid" column="oid" >
                  <generator class="native">
                  </generator>
             </id>
             <property name="name"/>

          </class>

          HourlyEmployee.hbm.xml
          <class name="HourlyEmployee" table="hourly">
             <id name="oid" column="oid" >
                  <generator class="native">
                  </generator>
             </id>
             <property name="name"/>
             <property name="rate"></property>
             <many-to-one name="company" class="Company"
              column="companyid" cascade="save-update"></many-to-one>
          </class>

          SalaryEmployee.hbm.xml
          <class name="SalariedEmployee" table="salaried">
             <id name="oid" column="oid" >
                  <generator class="native">
                  </generator>
             </id>
             <property name="name"/>
             <property name="salary"></property>
            
             <many-to-one name="company" class="Company"
              column="companyid" cascade="save-update"></many-to-one>
          </class>
          采用這種獨(dú)立映射方式的配置方法,在配置文件中沒有定義這些類之間的任何關(guān)系,也就是說,三個(gè)類都是獨(dú)立存在的。使用這種映射方式解決了相同屬性必須使用相同字段名的限制,但是從父類繼承的屬性需要在每個(gè)子類中都進(jìn)行相應(yīng)的定義,造成屬性配置的重復(fù)。
          <二>也可以使用一個(gè)xml文件來進(jìn)行映射,要使用<union-subclass>標(biāo)簽!!!
          注意:這里不能使用id生成策略中的native,而是要指定特定的生成策略。
          Employee2.hbm.xml:
          <class name="Employee" table="employee">
             <id name="oid" column="oid" >
                 <generator class="hilo">
                     <param name="table">tt_hi</param>
                     <param name="column">hi</param>
                  </generator>
             </id>
             <property name="name"/>
            
              <union-subclass name="HourlyEmployee" table="hourly" >
               <property name="rate"></property>
               <many-to-one name="Company"
          column="companyid" cascade="save-update">
          </many-to-one>
              </union-subclass>
             
              <union-subclass name="SalariedEmployee"
          table="salaried" >
               <property name="salary"></property>
               <many-to-one name="Company" column="companyid"
          cascade="save-update">
          </many-to-one>
              </union-subclass>
              </class>

          使用這種方式除了每個(gè)子類對(duì)應(yīng)一個(gè)表外,其定義方式與java對(duì)象的繼承非常相似,即子類可以繼承父類中公共的屬性定義,解決了屬性配置的重復(fù),但是,造成了相同屬性必須使用相同字段名的限制。
          2)所有類建一張表
          查尋效率比較高,但是會(huì)產(chǎn)生很多空間浪費(fèi),當(dāng)子類中的非空約束,就不大適用了,這是對(duì)于子類要使用<subclass>標(biāo)簽表示。
          配置文件:
          Company2.hbm.xml:
          <class name="Company" table="company">
             <id name="oid" column="oid" >
                  <generator class="native">
                  </generator>
             </id>
             <property name="name" type="string"/>
             <set name="employees"
          cascade="all-delete-orphan" inverse="true">
              <key column="companyid"></key>
              <one-to-many class="Employee"/>
             </set>
             </class>
          Employee3.hbm.xml:
          <class name="Employee" table="employee2">
             <id name="oid" column="oid" >
                 <generator class="native">
                  </generator>
             </id>
             <property name="name" />
             <discriminator column="employee_type" type="string"/>

             <subclass name="HourlyEmployee"
          discriminator-value="hourly">
              <property name="rate"></property>
               <many-to-one name="Company"
          column="companyid" cascade="all">
          </many-to-one>
             </subclass>
            
             <subclass name="SalariedEmployee"
          discriminator-value="salaried">
             <property name="salary"></property>
               <many-to-one name="Company"
          column="companyid" cascade="save-update">
          </many-to-one>   
             </subclass>
          </class>
          使 用這種映射方式需要注意的是它通過<discriminator>標(biāo)簽(<discriminator column="employee_type" type="string"/>)增加一個(gè)字段(這里是employee_type字段)來標(biāo)示某個(gè)記錄是屬于哪個(gè)實(shí)體對(duì)象的。通過< subclass>標(biāo)記中的discriminator-value屬性來定義哪個(gè)值代表哪個(gè)子類的持久化對(duì)象。
          3)只為具體類建表
          ·適用于不使用多態(tài)的情況下
          ·跟每個(gè)類建一張表的區(qū)別:
          ① 每個(gè)類一張表的映射策略所建立的表示獨(dú)立的,每個(gè)表都包括子類所自定義 的屬性和由父類鎖繼承的屬性的映射字段。
          ② 只為具體類建表,子類所對(duì)應(yīng)的表只包括子類所定義的屬性,而子類所對(duì)應(yīng)的 表與父類所對(duì)應(yīng)的表是通過外鍵來進(jìn)行關(guān)聯(lián)的,即當(dāng)持久化一個(gè)子類時(shí),需要在父 類的表和子類的表各增加一條記錄,這兩個(gè)記錄通過外鍵來關(guān)聯(lián)。
          ·好處:父類所定義的屬性就在父類的表中進(jìn)行映射,而子類所定義的屬性就在子類的表中進(jìn)行映射。避免了子類所定義的表中仍然需要定義父類屬性的映射字段。
          ·映射文件中的子類可以使用<join-subclass>標(biāo)簽來表示,并且引用父類的主 鍵作為共享主鍵,就是不需要指定id生成策略
          配置文件:
          Company3.hbm.xml:
          <class name="Company" table="company3">
             <id name="oid" column="oid" >
                  <generator class="native">
                  </generator>
             </id>
             <property name="name" type="string"/>
            
             <set name="employees" cascade="all-delete-orphan"
          inverse="true">
              <key column="companyid"></key>
              <one-to-many class="Employee"/>
             </set>
          </class>
          Employee4.hbm.xml:
          <class name="Employee" table="employee3">
             <id name="oid" column="oid" >
                 <generator class="native">
                  </generator>
             </id>
             <property name="name" />
            
             <joined-subclass name="HourlyEmployee" table="hourly2">
              <key column="oid"></key>
              <property name="rate"></property>
              <many-to-one name="Company" column="companyid"
          cascade="save-update">
          </many-to-one>
             </joined-subclass>

             <joined-subclass name="SalariedEmployee" table="salaried2">
              <key column="oid"></key>
              <property name="salary"></property>
              <many-to-one name="Company" column="companyid"
          cascade="save-update">
          </many-to-one>
             </joined-subclass>
          </class>

          posted on 2011-03-26 23:41 甜咖啡 閱讀(502) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

          <2011年3月>
          272812345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          統(tǒng)計(jì)

          常用鏈接

          留言簿(1)

          我參與的團(tuán)隊(duì)

          隨筆檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 静安区| 高州市| 通山县| 手游| 东辽县| 会理县| 常宁市| 哈密市| 石棉县| 龙里县| 托里县| 怀柔区| 昌江| 宜良县| 新丰县| 马尔康县| 宜昌市| 连州市| 民权县| 潍坊市| 黔东| 雷山县| 筠连县| 合肥市| 那曲县| 石首市| 阿拉尔市| 永安市| 宜州市| 广灵县| 天柱县| 阿勒泰市| 桃江县| 萨嘎县| 土默特左旗| 甘南县| 揭东县| 蕲春县| 潍坊市| 长葛市| 黄冈市|