對于對象的繼承關系, 建議“每一棵類繼承樹對應一個表”,即對每一個子類都進行使用<subclass>聲明。 例如:
有一個基類: class User, 兩個子類: class Admin和 class Guest.
則新建一個表格來對應這個繼承類數:
create table USER (
ID char(32) not null,
DISCRIMINATOR_USERTYPE varchar(255) not null,
NAME varchar(16) not null,
PASSWORD varchar(16) not null,
USER_LEVEL integer,
POWER_OTHER varchar(255),
GUEST_OTHER varchar(255),
primary key (ID)
);
其中字段DISCRIMINATOR_USERTYPE來記錄儲存的類別是屬于User、Admin或是Guest的記錄,如果該字段是ParentUser,則表示該筆數據是User類別,如果是ADMIN,表示是Admin的記錄,如果是GUEST,表示是Guest的記錄.
映像文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping>

<class name="com.zj.User" table="USER" discriminator-value="ParentUser">

<id name="id" type="string" unsaved-value="null">
<column name="ID" sql-type="char(32)"/>
<generator class="uuid.hex"/>
</id>

<discriminator column="DISCRIMINATOR_USERTYPE" type="string"/>

<property name="name" type="string" not-null="true">
<column name="NAME" length="16" not-null="true"/>
</property>

<property name="password" type="string" not-null="true">
<column name="PASSWORD" length="16" not-null="true"/>
</property>

<subclass name="com.zj.Admin" discriminator-value="ADMIN">
<property name="level" type="integer" column="ADMIN_LEVEL"/>

<property name="otherOfPower" type="string" column="POWER_OTHER"/>
</subclass>
<subclass name="com.zj.Guest" discriminator-value="GUEST">
<property name="otherOfGuest" type="string" column="GUEST_OTHER"/>
</subclass>
</class>

</hibernate-mapping> 注意上面文件中,在映像子類別時,使用<subclass>指明映像的子類別以及其discriminator-value來指定.
posted on 2005-09-11 00:21
ZhuJun 閱讀(381)
評論(0) 編輯 收藏 所屬分類:
開發手記 、
開源項目