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约束是一个严重的问题。