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約束是一個嚴重的問題。