Hibernate中支持3種形式實(shí)現(xiàn)繼承關(guān)系:
1. Table per concrete class 表與子類之間獨(dú)立一對(duì)一關(guān)系
2. Table per subclass 每個(gè)子類對(duì)應(yīng)一張子表,并與主類共享主表
3. Table per class hierarchy 表與類一對(duì)多關(guān)系
1. Table per concrete class
數(shù)據(jù)庫:父類沒有對(duì)應(yīng)的表,每個(gè)子類獨(dú)立對(duì)應(yīng)一張表,父類中的公共屬性將在每一張表中以相同冗余字段的形式出現(xiàn)。
映射文件:子類對(duì)應(yīng)的Hibernate的配映射文件與普通映射文件沒有特別區(qū)別,只是通過<class>節(jié)點(diǎn)的 polymorphism="implicit" 屬性實(shí)現(xiàn)隱式多態(tài)模式來實(shí)現(xiàn)與父類之間的繼承關(guān)系。
2. Table per subclass
數(shù)據(jù)庫:父類單獨(dú)映射一張主表,而每個(gè)子類分別映射一張子表。子表和主表通過外鍵相關(guān)聯(lián)。
映射文件:在映射文件中通過 <joined-subclass> 節(jié)點(diǎn)來表示主類和子類之間的繼承關(guān)系,如下:
<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
數(shù)據(jù)庫:用一張表對(duì)應(yīng)所有子類,包含所有子類字段,通過一個(gè)標(biāo)示類別的字段來區(qū)分不同子類對(duì)應(yīng)的數(shù)據(jù)。
映射文件:通過<subclass>?和<disriminator>節(jié)點(diǎn)來對(duì)不同子類加以區(qū)別,如下:
<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>