<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    甜咖啡

    我的IT空間

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

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

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


    1)每個類建一張表
    可以有效減少數(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類和它的兩個子類的繼承關(guān)系,
        因此無法映射Company類的employees集合,
        所以該文件僅僅映射了Company的id和name屬性 -->
    </class>
    <一>:需要針對每個類寫映射配置文件,就和普通的單表映射的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>
    采用這種獨立映射方式的配置方法,在配置文件中沒有定義這些類之間的任何關(guān)系,也就是說,三個類都是獨立存在的。使用這種映射方式解決了相同屬性必須使用相同字段名的限制,但是從父類繼承的屬性需要在每個子類中都進行相應(yīng)的定義,造成屬性配置的重復(fù)。
    <二>也可以使用一個xml文件來進行映射,要使用<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>

    使用這種方式除了每個子類對應(yīng)一個表外,其定義方式與java對象的繼承非常相似,即子類可以繼承父類中公共的屬性定義,解決了屬性配置的重復(fù),但是,造成了相同屬性必須使用相同字段名的限制。
    2)所有類建一張表
    查尋效率比較高,但是會產(chǎn)生很多空間浪費,當(dāng)子類中的非空約束,就不大適用了,這是對于子類要使用<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"/>)增加一個字段(這里是employee_type字段)來標(biāo)示某個記錄是屬于哪個實體對象的。通過< subclass>標(biāo)記中的discriminator-value屬性來定義哪個值代表哪個子類的持久化對象。
    3)只為具體類建表
    ·適用于不使用多態(tài)的情況下
    ·跟每個類建一張表的區(qū)別:
    ① 每個類一張表的映射策略所建立的表示獨立的,每個表都包括子類所自定義 的屬性和由父類鎖繼承的屬性的映射字段。
    ② 只為具體類建表,子類所對應(yīng)的表只包括子類所定義的屬性,而子類所對應(yīng)的 表與父類所對應(yīng)的表是通過外鍵來進行關(guān)聯(lián)的,即當(dāng)持久化一個子類時,需要在父 類的表和子類的表各增加一條記錄,這兩個記錄通過外鍵來關(guān)聯(liá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 甜咖啡 閱讀(507) 評論(0)  編輯  收藏


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


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

    導(dǎo)航

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

    統(tǒng)計

    常用鏈接

    留言簿(1)

    我參與的團隊

    隨筆檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 33333在线亚洲| 亚洲免费观看在线视频| 日韩国产欧美亚洲v片 | 日日操夜夜操免费视频| 亚洲人成综合网站7777香蕉| 久久www免费人成看片| 亚洲无限乱码一二三四区| 亚洲一区免费视频| 亚洲一区二区三区在线 | 久久精品免费电影| 亚洲AV午夜成人影院老师机影院| 久久成人免费大片| 亚洲成年人免费网站| 成人免费无码大片A毛片抽搐| 亚洲乱色伦图片区小说| 午夜亚洲福利在线老司机| caoporm超免费公开视频| 亚洲精品无码专区在线在线播放 | 亚洲va在线va天堂va四虎| 99视频免费播放| 亚洲一级片在线观看| 日韩在线免费电影| 久久精品无码专区免费| 亚洲网址在线观看你懂的| 最近中文字幕免费mv视频7| 麻豆安全免费网址入口| 亚洲成AV人在线观看天堂无码| 精品无码免费专区毛片| 亚洲AV无码成人精品区狼人影院| 亚洲欧洲自拍拍偷精品 美利坚| 一级毛片不卡片免费观看| 亚洲人成人网站18禁| 亚洲一区二区三区无码中文字幕| 天天影院成人免费观看| 国产AV无码专区亚洲AV蜜芽| 国产亚洲人成网站在线观看不卡| 国产成人精品免费视频动漫| 人人爽人人爽人人片av免费| 亚洲成aⅴ人片在线观| 亚洲国产精品一区二区第一页免| 最近中文字幕国语免费完整|