1.每個子類對應一張數據表
hbm和平常的沒有什么區別,一般是默認的隱式多態模式(polymorphism="implicit")。
優點:實現簡單。
缺點:
a.不太支持多態關聯。假如有一個表和這個基類有外鍵關系,則不容易實現。
b.多態查詢也有問題,針對基類的查詢需要幾個select語句把所有子類都查一遍。
c.由于都復制了主表字段,如果基類發生了變動,所有表都需要變動。
2.每個類一張表
范例hbm文件如下:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2011-10-17 17:49:02 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="com.Martin.M.TItem" table="T_Item">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="increment" />
</id>
<property name="name" type="java.lang.String" column="name" />
<property name="manufacturer" type="java.lang.String" column="manufacturer" />
<joined-subclass table="T_Book" name="com.Martin.M.TBook">
<key column="id" />
<property name="pageCount" type="java.lang.Integer" column="pageCount" />
</joined-subclass>
<joined-subclass table="T_DVD" name="com.Martin.M.TDVD">
<key column="id" />
<property name="reginCode" type="java.lang.String" column="reginCode" />
</joined-subclass>
</class>
</hibernate-mapping>不需要給子類編寫hbm文件。joined-subclass中可以進行嵌套。
優點:數據邏輯劃分清晰。
缺點:多表操作帶來的性能損耗相當可觀。
3.整個類層次結構映射到一張表
通過冗余字段的方式表達同數據類型,也就是一張表包含所有子類對象。
hbm范例文件如下:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2011-10-17 17:49:02 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="com.Martin.M.TItem" table="T_Item">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="increment" />
</id>
<discriminator column="category" type="java.lang.String" />
<property name="name" type="java.lang.String" column="name" />
<property name="manufacturer" type="java.lang.String" column="manufacturer" />
<subclass name="com.Martin.M.TBook" discriminator="1">
<property name="pageCount" type="java.lang.String" column="pageCount" />
</subclass>
<subclass name="com.Martin.M.TDVD" discriminator="2">
<property name="reginCode" type="java.lang.String" column="reginCode" />
</subclass>
</class>
</hibernate-mapping>它通過定義discriminator元素來確定類型字段,然后在各子類型中確定相應的類型字段值。讀取時,會根據這個類型字段值映射到相應的類型。
優點:性能和簡單性方面都勝出一籌。
缺點:子類的字段都要設置為可為空,從數據庫完整性約束來說,沒有NOT NULL約束是一個嚴重的問題。
hbm和平常的沒有什么區別,一般是默認的隱式多態模式(polymorphism="implicit")。
優點:實現簡單。
缺點:
a.不太支持多態關聯。假如有一個表和這個基類有外鍵關系,則不容易實現。
b.多態查詢也有問題,針對基類的查詢需要幾個select語句把所有子類都查一遍。
c.由于都復制了主表字段,如果基類發生了變動,所有表都需要變動。
2.每個類一張表
范例hbm文件如下:






















優點:數據邏輯劃分清晰。
缺點:多表操作帶來的性能損耗相當可觀。
3.整個類層次結構映射到一張表
通過冗余字段的方式表達同數據類型,也就是一張表包含所有子類對象。
hbm范例文件如下:





















優點:性能和簡單性方面都勝出一籌。
缺點:子類的字段都要設置為可為空,從數據庫完整性約束來說,沒有NOT NULL約束是一個嚴重的問題。