这种映射方式只需为继承关系树的employee根类创建一张表employees。如图14-4所示,在employees表中不仅提供和employee类的属性对应的字段,还要提供和它的两个子类的所有属型对应的字段,此外,employees表中需要额外加入一个字符串类型的employee_type字段,用于区分employee的具体类型。

company类和employee类有相应的映射文件,而hourlyemployee类和salariedemployee类没有相应的映射文件。图14-5显示了持久化类、映射文件和数据库表之间的对应关系。

14.2.1 创建映射文件
从company类到employee类是多态关联,由于关系数据模型描述了employee类和它的两个子类的继承关系,因此可以映射company类的employees集合。例程14-5是company.hbm.xml文件的代码,该文件不仅映射了company类的id和name属性,还映射了它的employees集合。
例程14-5 company.hbm.xml
<hibernate-mapping >
<class name="mypack.company" table="companies" >
<id name="id" type="long" column="id">
<generator class="increment"/>
</id>
<property name="name" type="string" column="name" />
<set
name="employees"
inverse="true"
lazy="true" >
<key column="company_id" />
<one-to-many class="mypack.employee" />
</set>
</class>
</hibernate-mapping>
employee.hbm.xml文件用于把employee类映射到employees表,在这个映射文件中,除了需要映射employee类本身的属性,还需要在元素中映射两个子类的属性。例程14-6是employee.hbm.xml文件的代码。
例程14-6 employee.hbm.xml
<hibernate-mapping >
<class name="mypack.employee" table="employees">
<id name="id" type="long" column="id">
<generator class="increment"/>
</id>
<discriminator column="employee_type" type="string" />
<property name="name" type="string" column="name" />
<many-to-one
name="company"
column="company_id"
class="mypack.company"
/>
<subclass name="mypack.hourlyemployee" discriminator-value="he" >
<property name="rate" column="rate" type="double" />
</subclass>
<subclass name="mypack.salariedemployee" discriminator-value="se" >
<property name="salary" column="salary" type="double" />
</subclass>
</class>
</hibernate-mapping>
在employee.hbm.xml文件中,元素指定employees表中用于区分employee类型的字段为employee_type,两个元素用于映射hourlyemployee类和salariedemployee类,元素的discriminator-value属性指定employee_type字段的取值。employees表中有以下记录:

闽公网安备 35060202000074号