把每個具體類映射到一張表是最簡單的映射方式。如圖14-2所示,在關系數據模型中只需定義COMPANIES、HOURLY_EMPLOYEES和SALARIED_EMPLOYEES表。為了敘述的方便,下文把HOURLY_EMPLOYEES表簡稱為HE表,把SALARIED_EMPLOYEES表簡稱為SE表。
HourlyEmployee類和HE表對應,HourlyEmployee類本身的rate屬性,以及從Employee類中繼承的id屬性和name屬性,在HE表中都有對應的字段。此外,HourlyEmployee類繼承了Employee類與Company類的關聯關系,與此對應,在HE表中定義了參照COMPANIES表的COMPANY_ID外鍵。
SalariedEmployee類和SE表對應,SalariedEmployee類本身的salary屬性,以及從Employee類中繼承的id屬性和name屬性,在SE表中都有對應的字段。此外,SalariedEmployee類繼承了Employee類與Company類的關聯關系,與此對應,在SE表中定義了參照COMPANIES表的COMPANY_ID外鍵。
Company類、HourlyEmployee類和SalariedEmployee類都有相應的映射文件,而Employee類沒有相應的映射文件。圖14-3顯示了持久化類、映射文件和數據庫表之間的對應關系。
<id name="id" type="long" column="ID">
<generator class="increment"/>
</id>
<property name="name" type="string" column="NAME" />
</class>
</hibernate-mapping>
HourlyEmployee.hbm.xml文件用於把HourlyEmployee類映射到HE表,在這個映射文件中,除了需要映射HourlyEmployee類本身的rate屬性,還需要映射從Employee類中繼承的name屬性,此外還要映射從Employee類中繼承的與Company類的關聯關系。例程14-2是HourlyEmployee.hbm.xml文件的代碼。
例程14-2 HourlyEmployee.hbm.xml
<hibernate-mapping >
<class name="mypack.HourlyEmployee" table="HOURLY_EMPLOYEES">
<id name="id" type="long" column="ID">
<generator class="increment"/>
</id>
<property name="name" type="string" column="NAME" />
<property name="rate" column="RATE" type="double" />
<many-to-one
name="company"
column="COMPANY_ID"
class="mypack.Company"
/>
</class>
</hibernate-mapping>
SalariedEmployee.hbm.xml文件用於把SalariedEmployee類映射到SE表,在這個映射文件中,除了需要映射SalariedEmployee類本身的salary屬性,還需要映射從Employee類中繼承的name屬性,此外還要映射從Employee類中繼承的與Company類的關聯關系。例程14-3是SalariedEmployee.hbm.xml文件的代碼。