看到j(luò)BPM中大量使用了subclass的用法,應(yīng)該說這個(gè)是比較OO的,設(shè)計(jì)的非常合理。
(一)、首先先去看看Hibernate的subclass:
1.對(duì)于“每一個(gè)類繼承樹對(duì)應(yīng)一個(gè)表”的策略來說,就需要使用<subclass>定義。
<subclass>
name="className" //子類的全名
discriminator-value="discriminator-value" //辨別標(biāo)識(shí),一個(gè)用于區(qū)分每個(gè)獨(dú)立的子類的值
proxy="proxyInterface" //指定一個(gè)類或接口,在延遲加載時(shí)作為代理使用
lazy="true|false"
dynamic-update="true|false"
dynamic-insert="true|false"
entity-name="entityName"
node="element-name">
<property ..../>
......
</subclass>
2.每個(gè)子類都應(yīng)該定義它自己的持久化屬性和子類。<version>和<id>屬性可以從根父類繼承下去。在一棵繼承樹上的每個(gè)子類都必須定義一個(gè)唯一的discriminator-value。如果沒有指定,就會(huì)使用Java類的全限定名。
3.必須在子類的影射中指定extends屬性來指定已影射的超類。
(二)在jBPM中的使用
1.在jBPM的definition組的類機(jī)構(gòu)中就采用上述的技術(shù)。其中ModuleDefinition是作為抽象父類存在的,而ContextDefinition、FileDefinition、LoggingDefinition、SchedulerDefinition、MgmtDefinition類是做為subclass存在的。
2.在父類中使用了discriminator鑒別器的技術(shù):在繼承策略中的“一個(gè)對(duì)象繼承樹應(yīng)對(duì)應(yīng)一個(gè)表”的策略中,<discriminator>元素是必須的。鑒別器字段包含標(biāo)志值,用于告知持久層應(yīng)該為某個(gè)特定的行創(chuàng)建哪一個(gè)類別的實(shí)例。例如:
父類的影射片段:
<discriminator type="char" column="CLASS_"/>
<!-- M : org.jbpm.module.def.ModuleDefinition -->
<!-- C : org.jbpm.context.def.ContextDefinition -->
<!-- F : org.jbpm.file.def.FileDefinition -->
<!-- L : org.jbpm.logging.def.LoggingDefinition -->
<!-- I : org.jbpm.scheduler.def.SchedulerDefinition -->
<!-- T : org.jbpm.taskmgmt.def.TaskMgmtDefinition -->
<!-- : -->
<!-- : -->
3.鑒別器字段的實(shí)際值是根據(jù)<class>和<subclass>元素中的discriminator-value屬性得來的。
例如:
父影射文件:
<class name="org.jbpm.module.def.ModuleDefinition"
table="JBPM_MODULEDEFINITION"
abstract="true"
discriminator-value="M"
lazy="false">
子影射文件:
<subclass name="org.jbpm.context.def.ContextDefinition"
extends="org.jbpm.module.def.ModuleDefinition"
discriminator-value="C"
lazy="false">
</subclass>