Hibernate中支持3種形式實現繼承關系:
1. Table per concrete class 表與子類之間獨立一對一關系
2. Table per subclass 每個子類對應一張子表,并與主類共享主表
3. Table per class hierarchy 表與類一對多關系
1. Table per concrete class
數據庫:父類沒有對應的表,每個子類獨立對應一張表,父類中的公共屬性將在每一張表中以相同冗余字段的形式出現。
映射文件:子類對應的Hibernate的配映射文件與普通映射文件沒有特別區別,只是通過<class>節點的 polymorphism="implicit" 屬性實現隱式多態模式來實現與父類之間的繼承關系。
2. Table per subclass
數據庫:父類單獨映射一張主表,而每個子類分別映射一張子表。子表和主表通過外鍵相關聯。
映射文件:在映射文件中通過 <joined-subclass> 節點來表示主類和子類之間的繼承關系,如下:
<hibernate-mapping>
? <class name="BaseClass" table="T_BASE">
??? <id name="id" column="id">
????? <generator class="native"/>
??? </id>
??? <property name="name" column="name"/>
??? <!--申明子類1-->
??? <joined-subclass name="SubClass1" table="T_SUB1">
????? <key column="id"/>
????? <property name="subName1" column="subName1"/>
??? </joined-subclass>
??? <!--申明子類2-->
??? <joined-subclass name="SubClass2" table="T_SUB1">
????? <key column="id"/>
????? <property name="subName2" column="subName2"/>
??? </joined-subclass>
? </class>
</hibernate-mapping>
3. Table per class hierarchy
數據庫:用一張表對應所有子類,包含所有子類字段,通過一個標示類別的字段來區分不同子類對應的數據。
映射文件:通過<subclass>?和<disriminator>節點來對不同子類加以區別,如下:
<hibernate-mapping>
? <class name="BaseClass" table="T_BASE">
??? <id name="id" column="id">
????? <generator class="native"/>
??? </id>
??? <discriminator column="category" type="string"/>??????????????? <------------- 聲明discriminator字段
??? <property name="name" column="name"/>
????<!--子類1-->?????
??? <subclass name="SubClass1" discriminator-value="1">???????<------------- discriminator為1,則是子類1
?????? <property name="subName1" column="subName1"/>
??? </subclass>??
??? <!--子類2-->?????
????<subclass name="SubClass2" discriminator-value="2">?????? <------------- discriminator為2,則是子類2
?????? <property name="subName2" column="subName2"/>
??? </subclass>
? </class>
<hibernate-mapping>