<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)航:
     
    主站蜘蛛池模板: 亚洲人成电影网站| 中文字幕人成人乱码亚洲电影| 亚洲大片免费观看| 国产激情免费视频在线观看| A级毛片高清免费视频在线播放| 中文字幕不卡免费高清视频| 国产免费MV大全视频网站| 久久一区二区免费播放| 中文字幕久无码免费久久| 国内精品久久久久影院免费| 亚欧免费一级毛片| 亚洲毛片免费观看| 无限动漫网在线观看免费| 永久中文字幕免费视频网站| yy6080亚洲一级理论| 国产成人亚洲精品91专区手机| 亚洲精品乱码久久久久久中文字幕 | 综合亚洲伊人午夜网 | 日本亚洲色大成网站www久久| 国产亚洲国产bv网站在线| 在线aⅴ亚洲中文字幕| 青草久久精品亚洲综合专区| 日韩少妇内射免费播放| 99在线免费视频| 在线观看H网址免费入口| 美女被免费视频网站a国产| 亚洲欧洲中文日韩av乱码| 亚洲福利在线观看| 国产精品亚洲片夜色在线| 免费国产va视频永久在线观看| 中文毛片无遮挡高清免费| 99在线观看免费视频| 最近的免费中文字幕视频 | 成年人网站免费视频| 日本一道高清不卡免费| 国产成人综合亚洲AV第一页| 337p日本欧洲亚洲大胆色噜噜 | 亚洲av日韩av无码| 亚洲中文字幕一二三四区| 国产97视频人人做人人爱免费| 免费国产黄网站在线观看 |