2008年11月12日 星期三

ORM 繼承與複合鍵設計

客戶用 hibernate 實做中提出一個關於繼承與複合鍵的問題,題目是這樣的:
1. 父類別是抽象類別,父類別已定義 主鍵 = 序號
2. 有兩個子類別繼承
3. 子類別的 主鍵 = 子類別型態 + 父類別序號

要怎樣用 hibernate 的 ORM 實現這種設計?

以下是我的答覆:首先須了解 ENTITY_TYPE 代表類別型態這件事的定義,我猜測 ParentEntity, Child1Entity, Child2Entity 裡頭有有對應的 entityType 屬性,如果答案是肯定的,我就不會用 <discriminator column="ENTITY_TYPE" type="string" length="10" /> 這樣的設定去識別子類別,我會用以下的 ORM 方式去設計

<discriminator column="CLASS_TYPE" type="string" length="10" />
<property name="entityType" column="ENTITY_TYPE" />

<subclass name="Child1Entity" discriminator-value="Child1">
...
</subclass>
<subclass name="Child1Entity" discriminator-value="Child2">
...
</subclass>

如果ParentEntity, Child1Entity, Child2Entity 裡頭沒有對應的 entityType 屬性,那麼複合鑑的問題又要怎樣處理? 這部分有幾種選項
1. 採用 hibernate 提供的 composite-id 設定方式
2. 由物件負責處理,以 ParentEntity 為例
class ParentEntity {
String serial;
String entityType;
public String getSerial() {
return serial;
}
public String getEntityType() {
return tokenType;
}
public String getEntityId() {
return getEntityType()+getSerial();
}
protected void setEntityId(String eid) {
// do nothing
}
}

其 ORM 可以宣告如下
<id name="entityId" column="ENTITY_ID" length="128"/>

3. 另外寫一個 EntityID 產生程式

不知道各位是否有其他見解? 歡迎加入討論

沒有留言: