2012年3月28日 星期三

Hibernate 教學 - 繼承 : Table per concrete class with implicit polymorphism

本篇介紹的是Hibernate繼承機制方案中的另一解法

跟上一篇大同小異 Hibernate 教學 - 繼承 : Table per concrete class with unions (<如需看以下內容請先看這篇)

基本上Discount 和 Free 這兩個實體類別都會對應一個Table

差別式在於Table per concrete class with unions 這個作法下

他只需透過一個映射檔就能夠交代繼承關係(union-subclass)

那麼在 Table per concrete class with implicit polymorphism 這個情況下

你必須針對每個實體類都撰寫一份映射文件

這樣子的狀況下 就會出現共同屬性(父類別的屬性) 會出現在每份映射文件內

也就是說 會寫到一些重複的代碼,如之前的範例就會造成

在 Preferential 這個父類別下的 id 和 name 屬性必須重複在

Discount.hbm.xml 和 Free.hbm.xml 中去定義

當然Table per concrete class with implicit polymorphism 這個方法是繼承架構下

最易懂也易學的一個基本概念。

到這邊 就以上一篇的範例為基礎,更換成Table per concrete class with implicit polymorphism

很簡單,其他程式都跟上一篇一樣

不一樣的地方就是你必須定義兩個映射文件Discount.hbm.xml 和 Free.hbm.xml

內容如下:
Discount.hbm.xml


<hibernate-mapping>
     <class name="org.pojo.Discount" table="t_discount">
           <!-- 共有屬性 -->
           <id name="id" column="id">
               <generator class="increment" /> <!-- 自增 -->
           </id>
          
           <!-- 共有屬性 -->
           <property name="name" />
           <!-- Discount 所擁有的屬性 -->
           <property name="percent" />
    
     </class>
</hibernate-mapping>


以及 Free.hbm.xml


<hibernate-mapping>
     <class name="org.pojo.Free" table="t_free">
           <!-- 共有屬性 -->
           <id name="id" column="id">
               <generator class="increment" /> <!-- 自增 -->
           </id>
          
            <!-- 共有屬性 -->
           <property name="name" />
           <!-- Free 所擁有的屬性 -->
           <property name="count"></property>
     </class>
</hibernate-mapping>


有注意到上面重複的地方了吧,就是 id 和 name 摟。

最後記得在 hibernate.cfg.xml 中註冊這兩個映射文件


<mapping resource="org/pojo/Free.hbm.xml"></mapping>
<mapping resource="org/pojo/Discount.hbm.xml"></mapping>


最後同樣的可以透過上一篇題到的測試程式去執行看看目前的結果吧!

沒有留言:

張貼留言