映射文件大略如下:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Animal" table="animal">
<id column="id" name="id" type="java.lang.Long">
<generator class="assigned"/>
</id>
<property column="animalproperty" name="someproperty" type="String"/>
<joined-subclass name="Dog" table="dog">
<key column="dogid"/>
<property column="dogproperty1" name="dogproperty1" type="String"/>
<property column="dogproperty2" name="dogproperty2" type="String"/>
</joined-subclass>
<joined-subclass name="Cat" table="cat">
<key column="catid"/>
<property column="catproperty1" name="catproperty1" type="String"/>
<property column="catproperty2" name="catproperty2" type="String"/>
</joined-subclass>
<joined-subclass name="Pig" table="pig">
<key column="pigid"/>
<property column="pigproperty1" name="pigproperty1" type="String"/>
<property column="pigproperty2" name="pigproperty2" type="String"/>
</joined-subclass>
<!--other sub-class-->
</class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Animal" table="animal">
<id column="id" name="id" type="java.lang.Long">
<generator class="assigned"/>
</id>
<property column="animalproperty" name="someproperty" type="String"/>
<joined-subclass name="Dog" table="dog">
<key column="dogid"/>
<property column="dogproperty1" name="dogproperty1" type="String"/>
<property column="dogproperty2" name="dogproperty2" type="String"/>
</joined-subclass>
<joined-subclass name="Cat" table="cat">
<key column="catid"/>
<property column="catproperty1" name="catproperty1" type="String"/>
<property column="catproperty2" name="catproperty2" type="String"/>
</joined-subclass>
<joined-subclass name="Pig" table="pig">
<key column="pigid"/>
<property column="pigproperty1" name="pigproperty1" type="String"/>
<property column="pigproperty2" name="pigproperty2" type="String"/>
</joined-subclass>
<!--other sub-class-->
</class>
</hibernate-mapping>
...
<key column="pigid"/>都改成
<key column="id"/>因此才说这种库表结构很别扭.
在实际应用中,处理继承问题时,采用这种继承映射方式无论从设计模式还是数据结构的角度都是比较合理的。因此这种库表结构是比较贴近实际需求的,一点不会别扭。只是在查询父类的时候,如果采用我上面提到的hql,则会同时将所有子表的所有字段(不仅仅id)全部列出,这个问题你亲手做做就明白是怎么回事了。