映射文件大略如下:
<?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>

解决方案 »

  1.   

    以前用过,但是后来改了设计.你只是要查animal的话,应该不会查到Dog之类的啊.你不会是说查到dogid这些字段吧?hibernate文档中id都用同1个字段:<key column="dogid"/>
    ...
    <key column="pigid"/>都改成
    <key column="id"/>因此才说这种库表结构很别扭.
      

  2.   

    hibernate文档中id都用同1个字段,实际上每个子类中的id是不同的,子类中的id兼具有主键和外键的功能,你的这种做法只是改了个名字而已,并没有解决问题。
    在实际应用中,处理继承问题时,采用这种继承映射方式无论从设计模式还是数据结构的角度都是比较合理的。因此这种库表结构是比较贴近实际需求的,一点不会别扭。只是在查询父类的时候,如果采用我上面提到的hql,则会同时将所有子表的所有字段(不仅仅id)全部列出,这个问题你亲手做做就明白是怎么回事了。
      

  3.   

    顶一下,我现在用Orcale 的TopLink也有这个问题.