1.每個子類對應(yīng)一張數(shù)據(jù)表
hbm和平常的沒有什么區(qū)別,一般是默認(rèn)的隱式多態(tài)模式(polymorphism="implicit")。

優(yōu)點:實現(xiàn)簡單。
缺點:
a.不太支持多態(tài)關(guān)聯(lián)。假如有一個表和這個基類有外鍵關(guān)系,則不容易實現(xiàn)。
b.多態(tài)查詢也有問題,針對基類的查詢需要幾個select語句把所有子類都查一遍。
c.由于都復(fù)制了主表字段,如果基類發(fā)生了變動,所有表都需要變動。

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中可以進(jìn)行嵌套。

優(yōu)點:數(shù)據(jù)邏輯劃分清晰。
缺點:多表操作帶來的性能損耗相當(dāng)可觀。

3.整個類層次結(jié)構(gòu)映射到一張表
通過冗余字段的方式表達(dá)同數(shù)據(jù)類型,也就是一張表包含所有子類對象。
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元素來確定類型字段,然后在各子類型中確定相應(yīng)的類型字段值。讀取時,會根據(jù)這個類型字段值映射到相應(yīng)的類型。

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