跟上一篇大同小異 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>
最後同樣的可以透過上一篇題到的測試程式去執行看看目前的結果吧!
沒有留言:
張貼留言