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

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

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

    隨筆-31  評(píng)論-14  文章-0  trackbacks-0

    單表繼承映射

      每棵類(lèi)繼承樹(shù)使用一個(gè)表。

       

        映射文件Extends.hbm.xml

    <hibernate-mapping package="com.snail.hibernate">
        <class name="Animal" table="t_animal" lazy="false">
            <id name="id">
                <generator class="native"/>
            </id>
            <discriminator column="type" type="string"/>
            <property name="name"/>
            <property name="sex"/>
            <subclass name="Pig" discriminator-value="P">
                 <property name="weight"/>
            </subclass>
            <subclass name="Brid" discriminator-value="B">
                <property name="height"/>
            </subclass>
        </class>
    </hibernate-mapping>

     因?yàn)轭?lèi)繼承樹(shù)肯定是對(duì)應(yīng)多個(gè)類(lèi),要把多個(gè)類(lèi)的信息存放在一張表中,必須有某種機(jī)制來(lái)區(qū)分哪些記錄是屬于哪個(gè)類(lèi)的。這種機(jī)制就是,在表中添加一個(gè)字段,用這個(gè)字段的值來(lái)進(jìn)行區(qū)分。用hibernate實(shí)現(xiàn)這種策略的時(shí)候,有如下步驟:

    (一)父類(lèi)用普通的<class>標(biāo)簽定義

    (二)在父類(lèi)中定義一個(gè)discriminator,即指定這個(gè)區(qū)分的字段的名稱和類(lèi)型

            如:<discriminator column=XXX type=string/>

    (三)子類(lèi)使用<subclass>標(biāo)簽定義,在定義subclass的時(shí)候,需要注意如下幾點(diǎn):

          1.Subclass標(biāo)簽的name屬性是子類(lèi)的全路徑名;

          2.Subclass標(biāo)簽中,用discriminator-value屬性來(lái)標(biāo)明本子類(lèi)的discriminator字段(用來(lái)區(qū)分不同類(lèi)的字段)的值;

          3.Subclass標(biāo)簽,既可以被class標(biāo)簽所包含(這種包含關(guān)系正是表明了類(lèi)之間的繼承關(guān)系),也可以與class標(biāo)簽平行。 當(dāng)subclass標(biāo)簽的定義與class標(biāo)簽平行的時(shí)候,需要在subclass標(biāo)簽中,添加extends屬性,里面的值是父類(lèi)的全路徑名稱。

          4.子類(lèi)的其它屬性,像普通類(lèi)一樣,定義在subclass標(biāo)簽的內(nèi)部。

    具體表繼承映射

      每個(gè)具體類(lèi)一張表。(同上例)


    映射文件Extends.hbm.xml

    <hibernate-mapping package="com.snail.hibernate">
        <class name="Animal" table="t_animal" lazy="false" abstract="true">
            <id name="id">
                <generator class="assigned"/>
            </id>
            <property name="name"/>
            <property name="sex"/>
            <union-subclass name="Pig" table="t_pig">
                <property name="weight"/>
            </union-subclass>
            <union-subclass name="Brid" table="t_brid">
                <property name="height"/>
            </union-subclass>
        </class>
    </hibernate-mapping>

    這種策略是使用union-subclass標(biāo)簽來(lái)定義子類(lèi)的。每個(gè)子類(lèi)對(duì)應(yīng)一張表,而且這個(gè)表的信息是完備的,即包含了所有從父類(lèi)繼承下來(lái)的屬性映射的字段(這就是它跟joined-subclass的不同之處,joined-subclass定義的子類(lèi)的表,只包含子類(lèi)特有屬性映射的字段)。實(shí)現(xiàn)這種策略的時(shí)候,有如下步驟:

    (一)父類(lèi)用普通<class>標(biāo)簽定義即可;

    (二)子類(lèi)用<union-subclass>標(biāo)簽定義,在定義union-subclass的時(shí)候,需要注意如下幾點(diǎn):

          1.Union-subclass標(biāo)簽不再需要包含key標(biāo)簽(與joined-subclass不同)。

          2.Union-subclass標(biāo)簽,既可以被class標(biāo)簽所包含(這種包含關(guān)系正是表明了類(lèi)之間的繼承關(guān)系),也可以與class標(biāo)簽平行。 當(dāng)Union-subclass標(biāo)簽的定義與class標(biāo)簽平行的時(shí)候,需要在Union-subclass標(biāo)簽中,添加extends屬性,里面的值是父類(lèi)的全路徑名稱。

         3.子類(lèi)的其它屬性,像普通類(lèi)一樣,定義在Union-subclass標(biāo)簽的內(nèi)部。這個(gè)時(shí)候,雖然在union-subclass里面定義的只有子類(lèi)的屬性,但是因?yàn)樗^承了父類(lèi),所以,不需要定義其它的屬性,在映射到數(shù)據(jù)庫(kù)表的時(shí)候,依然包含了父類(lèi)的所有屬性的映射字段。

    注意:在保存對(duì)象的時(shí)候id不能重復(fù)(不能使用數(shù)據(jù)庫(kù)的自增方式生成主鍵)

    類(lèi)表繼承映射

      每個(gè)類(lèi)一張表。(同上例)

      

    映射文件Extends.hbm.xml

    1. <hibernate-mapping package="com.snail.hibernate">  
    2.     <class name="Animal" table="t_animal" lazy="false">  
    3.         <id name="id">  
    4.             <generator class="native"/>  
    5.         </id>  
    6.         <property name="name"/>  
    7.         <property name="sex"/>  
    8.         <joined-subclass name="Pig" table="t_pig">  
    9.             <key column="pid"/>  
    10.             <property name="weight"/>  
    11.         </joined-subclass>  
    12.         <joined-subclass name="Brid" table="t_brid">  
    13.             <key column="bid"/>  
    14.             <property name="height"/>  
    15.         </joined-subclass>  
    16.     </class>  
    17. </hibernate-mapping>  

      這種策略是使用joined-subclass標(biāo)簽來(lái)定義子類(lèi)的。父類(lèi)、子類(lèi),每個(gè)類(lèi)都對(duì)應(yīng)一張數(shù)據(jù)庫(kù)表。在父類(lèi)對(duì)應(yīng)的數(shù)據(jù)庫(kù)表中,實(shí)際上會(huì)存儲(chǔ)所有的記錄,包括父類(lèi)和子類(lèi)的記錄;在子類(lèi)對(duì)應(yīng)的數(shù)據(jù)庫(kù)表中,這個(gè)表只定義了子類(lèi)中所特有的屬性映射的字段。子類(lèi)與父類(lèi),通過(guò)相同的主鍵值來(lái)關(guān)聯(lián)。實(shí)現(xiàn)這種策略的時(shí)候,有如下步驟:

    (一)父類(lèi)用普通的<class>標(biāo)簽定義即可,父類(lèi)不再需要定義discriminator字段;

    (二)子類(lèi)用<joined-subclass>標(biāo)簽定義,在定義joined-subclass的時(shí)候,需要注意如下幾點(diǎn):

          1.Joined-subclass標(biāo)簽的name屬性是子類(lèi)的全路徑名

          2Joined-subclass標(biāo)簽需要包含一個(gè)key標(biāo)簽,這個(gè)標(biāo)簽指定了子類(lèi)和父類(lèi)之間是通過(guò)哪個(gè)字段來(lái)關(guān)聯(lián)的。

            如:<key column=PARENT_KEY_ID/>,這里的column,實(shí)際上就是父類(lèi)的主鍵對(duì)應(yīng)的映射字段名稱。

          3.Joined-subclass標(biāo)簽,既可以被class標(biāo)簽所包含(這種包含關(guān)系正是表明了類(lèi)之間的繼承關(guān)系),也可以與class標(biāo)簽平行。 當(dāng)Joined-subclass標(biāo)簽的定義與class標(biāo)簽平行的時(shí)候,需要在Joined-subclass標(biāo)簽中,添加extends屬性,里面的值是父類(lèi)的全路徑名稱。

          4.子類(lèi)的其它屬性,像普通類(lèi)一樣,定義在joined-subclass標(biāo)簽的內(nèi)部。


    posted on 2012-07-16 22:16 zhanghu198901 閱讀(998) 評(píng)論(0)  編輯  收藏

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 男女交性永久免费视频播放| 久久99精品国产免费观看| 久久精品网站免费观看| 亚洲综合色一区二区三区小说| 丝瓜app免费下载网址进入ios| 国产成人亚洲精品影院| 日韩精品无码永久免费网站| 亚洲人成人网站在线观看| 国产精品1024在线永久免费| 亚洲AV无码XXX麻豆艾秋| 国产麻豆剧传媒精品国产免费| 色欲色欲天天天www亚洲伊| 免费亚洲视频在线观看| 亚洲精品国产啊女成拍色拍| 99re免费视频| 国产午夜亚洲精品| 精品剧情v国产在免费线观看| 亚洲av综合av一区二区三区 | 亚洲免费日韩无码系列| 一级做a爱过程免费视| 亚洲国产精品无码专区在线观看| 亚洲男同gay片| 国产精品免费一级在线观看| a级毛片免费观看网站| 久久久久亚洲精品无码系列| 91手机看片国产永久免费| 自拍偷自拍亚洲精品被多人伦好爽| 亚洲日本乱码卡2卡3卡新区| 国产成人免费福利网站| 久久久精品视频免费观看| 亚洲色图国产精品| 日本一道本高清免费| 人妻在线日韩免费视频| 久久亚洲国产成人影院| 久久久久无码专区亚洲av | 国产成人A在线观看视频免费| 污视频网站在线观看免费| 亚洲第一成年男人的天堂| 夫妻免费无码V看片| 久久精品成人免费观看| 国产精品亚洲色图|