【hibernate】---- 繼承對映
阿新 • • 發佈:2019-01-31
看hibernate視訊的時候,老師講的繼承對映非常好,所以就在這裡總結一下吧!
繼承對映分為三類:
1、單表繼承,每一個類繼承樹使用一張表
2、具體表繼承,每個類一個表
3、類表繼承,每個具體類一個表
單表繼承:
這種策略其實就是把子類的資訊和父類的資訊共同放到一張表中,那麼怎麼區分哪個記錄是屬於哪個類的呢?hibernate用的機制就是在表中新增一個欄位,用這個欄位的值來區分那個記錄對應哪個表。在這種策略下,如果某個類中沒有這個屬性的值,那麼這個屬性就會被自動賦值為null。
這種hibernate策略的示意圖如下:
這種策略,體現在hibernate的配置檔案中是用<subclass>標籤來表示的。
那麼hibernate配置檔案中的部分程式碼如下:
具體表繼承: 這種策略其實就是父類和子類都各自對應一張資料庫表,但是在父類對應的表中,記錄了所有記錄的公共資訊;在子類對應的資料庫表中,只記錄了子類所特有的屬性對映的欄位。他們通過一對一主鍵方式關聯起來。 示意圖如下:
這種策略,體現在hibernate的配置檔案中是用<Joined-subclass>標籤來表示的。需要注意的是這個標籤中的name屬性是子類的全路徑名稱。這個標籤裡面的key標籤中的column屬性就是父類的主鍵的值對應的對映欄位名稱。 部分程式碼如下:
類表繼承: 這種策略的關鍵就是:每個具體的子類都包含了父類的資訊和自己獨特的資訊。每個子類對應一張表。 示意圖如下:
這種策略,體現在hibernate的配置檔案中是用<union-subclass>標籤來表示的。 部分配置檔案程式碼如下:
這種策略,體現在hibernate的配置檔案中是用<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" 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>