1. 程式人生 > >【hibernate】---- 繼承對映

【hibernate】---- 繼承對映

    看hibernate視訊的時候,老師講的繼承對映非常好,所以就在這裡總結一下吧!     繼承對映分為三類: 1、單表繼承,每一個類繼承樹使用一張表 2、具體表繼承,每個類一個表 3、類表繼承,每個具體類一個表 單表繼承:    這種策略其實就是把子類的資訊和父類的資訊共同放到一張表中,那麼怎麼區分哪個記錄是屬於哪個類的呢?hibernate用的機制就是在表中新增一個欄位,用這個欄位的值來區分那個記錄對應哪個表。在這種策略下,如果某個類中沒有這個屬性的值,那麼這個屬性就會被自動賦值為null。 這種hibernate策略的示意圖如下:
     這種策略,體現在hibernate的配置檔案中是用<subclass>標籤來表示的。
     那麼hibernate配置檔案中的部分程式碼如下:
<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC  
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping package="com.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="Bird" discriminator-value="B"> 
            <property name="height"/> 
        </subclass> 
    </class> 
</hibernate-mapping>  


具體表繼承:     這種策略其實就是父類和子類都各自對應一張資料庫表,但是在父類對應的表中,記錄了所有記錄的公共資訊;在子類對應的資料庫表中,只記錄了子類所特有的屬性對映的欄位。他們通過一對一主鍵方式關聯起來。 示意圖如下:
   這種策略,體現在hibernate的配置檔案中是用<Joined-subclass>標籤來表示的。需要注意的是這個標籤中的name屬性是子類的全路徑名稱。這個標籤裡面的key標籤中的column屬性就是父類的主鍵的值對應的對映欄位名稱。 部分程式碼如下:
<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC  
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping package="com.hibernate"> 
    <class name="Animal" table="t_animal"> 
        <id name="id"> 
            <generator class="native"/> 
        </id> 
        <property name="name"/> 
        <property name="sex"/> 
        <joined-subclass name="Pig" table="t_pig"> 
            <key column="pid"/> 
            <property name="weight"/> 
        </joined-subclass> 
        <joined-subclass name="Bird" table="t_bird"> 
            <key column="bid"/> 
            <property name="height"/> 
        </joined-subclass> 
    </class> 
</hibernate-mapping>  


類表繼承:     這種策略的關鍵就是:每個具體的子類都包含了父類的資訊和自己獨特的資訊。每個子類對應一張表。 示意圖如下:
這種策略,體現在hibernate的配置檔案中是用<union-subclass>標籤來表示的。 部分配置檔案程式碼如下:
<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC  
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping package="com.hibernate"> 
    <class name="Animal" table="t_animal" 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="Bird" table="t_bird"> 
            <property name="height"/> 
        </union-subclass> 
    </class> 
</hibernate-mapping>