映射
一、 继承映射
1、 一个类继承映射成一张表
有三个类Animal Pig Bird,其中Pig和Bird都继承自Animal
<class name="Animal" table="t_animal">
<id name="id">
<generator class="native"/>
</id>
<discriminator column="animal_type" type="string" />
<property name="name" />
<subclass name="Pig" discriminator-value="P">
<property name="weight"/>
</subclass>
<subclass name="Bird" discriminator-value="B"/>
<property name="height"
</subclass>
</class>
简单说明:为了区分到底是Pig 还是Bird 需要加一个鉴别标签<discriminator /> 然后在子类上加一个鉴别值discriminator-value 再将数据在插入数据库时,就会自动将这个鉴别值加入。
在加载的过程中有可能用到多态性
多态查询:在hibernate加载数据的时候能鉴别出正真的类型(instanceOf)
因为load是支持延迟加载的,它在加载的过程中产生一个代理类,因此默认情况下不支持多态查询,为了让它支持多态只有把lazy设置为false
2、 每个类映射成一张表
<class name="Animal" table="t_animal">
<id name="id">
<generator class="native"/>
</id>
<property name="name" />
<joined-subclass name="Pig" table="t_pig">
<key column="pigid" />
<property name="weight"/>
</joined-subclass>
<joined-subclass name="Bird" table="t_bird">
<key column="birdid"/>
<property name="height" />
</joined-subclass>
</class>
这里应用了<joined-subclass />标签。
这样是产生了三张表。
3、 具体类映射成一张表
<class name="Animal" abstract="true">
<id name="id">
<generator class=""/>
</id>
<property name="name" />
<union-subclass name="Pig" table="t_pig">
<property name="weight"/>
</union-subclass>
<union-subclass name="Bird" table="t_bird">
<property name="height" />
</union-subclass>
</class>
Animal 是一个抽象类他不生成表,此时的主键生成策略不能用native。