Hibernate的subclass用法

Hibernate的subclass用法(轉自java Eye個人空間)

文章分類:Java編程

 看到jBPM中大量使用了subclass的用法,應該說這個是比較OO的,設計的非常合理。
  (一)、首先先去看看Hibernate的subclass:
  1.對於“每一個類繼承樹對應一個表”的策略來說,就需要使用<subclass>定義。
  <subclass>
            name="className"  //子類的全名
            discriminator-value="discriminator-value" //辨別標識,一個用於區分每個獨立的子類的值
            proxy="proxyInterface" //指定一個類或接口,在延遲加載時作爲代理使用
            lazy="true|false"
            dynamic-update="true|false"
            dynamic-insert="true|false"
            entity-name="entityName"
            node="element-name">
           <property ..../>
          ......
        </subclass>
  2.每個子類都應該定義它自己的持久化屬性和子類。<version>和<id>屬性可以從根父類繼承下去。在一棵繼承樹上的每個子類都必須定義一個唯一的discriminator-value。如果沒有指定,就會使用Java類的全限定名。
  3.必須在子類的影射中指定extends屬性來指定已影射的超類。

 (二)在jBPM中的使用
  1.在jBPM的definition組的類機構中就採用上述的技術。其中ModuleDefinition是作爲抽象父類存在的,而 ContextDefinition、FileDefinition、LoggingDefinition、SchedulerDefinition、 MgmtDefinition類是做爲subclass存在的。
 2.在父類中使用了discriminator鑑別器的技術:在繼承策略中的“一個對象繼承樹應對應一個表”的策略中,<discriminator>元素是必須的。鑑別器字段包含標誌值,用於告知持久層應該爲某個特定的行創建哪一個類別的實例。例如:
  父類的影射片段:
    <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.鑑別器字段的實際值是根據<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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章