国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Hibernate4.x之映射關系--繼承映射

2019-11-14 22:04:36
字體:
來源:轉載
供稿:網友
Hibernate4.x之映射關系--繼承映射

Hibernate的繼承映射可以理解為持久化類之間的繼承關系。例如:人和學生之間的關系。學生繼承了人,可以認為學生是一個特殊的人,如果對人進行查詢,學生的實例也將被得到。

Hibernate支持以下三種繼承映射策略:

  1. 使用subclass進行映射:將域模型中的每一個實體對象映射到一個獨立的表中,也就是說不用在關系數據模型中考慮域模型中的繼承關系和多態
  2. 使用joined-subclass進行映射:對于繼承關系中的子類使用同一個表,這就需要在數據庫表匯總增加額外的區分子類類型的字段
  3. 使用union-subclass進行映射:域模型中的每個類映射到一個表,通過關系數據庫模型中的外鍵來描述表之間的繼承關系,這也就相當于按照域模型的結構來建立數據庫中的表,并通過外鍵來建立表之間的繼承關系。

下面分情況具體了解以上三種映射策略。采用Person作為父類,Student作為子類來詳細解釋以上三種策略實現。其中Perosn(id, name, age), Studnet(school)

 采用subclass進行映射:

  • 采用subclass的繼承映射可以實現對于繼承關系中父類和子類使用同一張表
  • 因為父類和子類的實例全部保存在同一個表中,因此需要在該表內增加一列,使用該列來區分每行記錄到底是哪個類的實例----這個列被稱為辨別者列(discriminator)
  • 在這種映射策略下,使用subclass來映射子類,使用class或subclass的discriminator-value屬性指定辨別者列的值
  • 所有子類定義的字段都不能有非空約束。如果為那些字段添加非空約束,那么父類的實例在那些列其實并沒有指,這將引起數據庫完整性沖突,導致父類的實例無法保存到數據庫中 

Person.hbm.xml

 1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 4 <!-- Generated 2014-11-30 9:34:50 by Hibernate Tools 3.4.0.CR1 --> 5 <hibernate-mapping package="com.yl.hibernate.subclass"> 6     <class name="Person" table="PERSONS" discriminator-value="PERSON"> 7         <id name="id" type="java.lang.Integer"> 8             <column name="ID" /> 9             <generator class="native" />10         </id>11         12         <!-- 配置辨別者列 -->13         <discriminator column="TYPE" type="string"></discriminator>14         15         <PRoperty name="name" type="java.lang.String">16             <column name="NAME" />17         </property>18         <property name="age" type="int">19             <column name="AGE" />20         </property>21         <!-- 映射子類Student, 使用subclass進行映射 -->22         <subclass name="Student" discriminator-value="STUDENT">23             <property name="school" type="string" column="SCHOOL"></property>24         </subclass>25     </class>26 </hibernate-mapping>

采用joined-subclass進行映射

  • 采用joined-subclass元素的繼承映射可以實現每個子類一張表
  • 采用這種映射策略時,父類實例保存在父類表中,子類實例有父類表和子類表共同存儲。因為子類實例也是一個特殊的父類實例,因此必然也包含了父類實例的屬性。于是將子類和父類共有的屬性保存在父類表中,子類增加的屬性,則保存在子類表中。
  • 在這種映射策略下,無需使用辨別者列,但需要為每個子類使用key元素映射共有主鍵。
  • 子類增加的屬性可以添加非空約束。因為子類的屬性和父類的屬性沒有保存在同一個表中 

Person.hbm.xml

 1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 4 <!-- Generated 2014-11-30 9:34:50 by Hibernate Tools 3.4.0.CR1 --> 5 <hibernate-mapping package="com.yl.hibernate.joined.subclass"> 6     <class name="Person" table="PERSONS"> 7         <id name="id" type="java.lang.Integer"> 8             <column name="ID" /> 9             <generator class="native" />10         </id>11         12         <property name="name" type="java.lang.String">13             <column name="NAME" />14         </property>15         <property name="age" type="int">16             <column name="AGE" />17         </property>18         <!-- 映射子類Student, 使用joined-subclass進行映射 -->19         <joined-subclass name="Student" table="STUDENTS">20             <key column="STUDENT_ID"></key>21             <property name="school" type="string" column="SCHOOL"></property>22         </joined-subclass>23         24     </class>25 </hibernate-mapping>

采用union-subclass進行映射

  • 采用union-subclass元素可以實現將每一個實體對象映射到一個獨立的表中
  • 子類增加的屬性可以有非空約束。即父類實例的數據保存在父表中,而子類實例的數據保存在子類表中
  • 子類實例的數據僅保存在子類表中,而在父類表中沒有任何的記錄
  • 在這種映射策略下,子類表的字段會比父類表的映射字段要多,因為子類表的字段等于父類表的字段加子類增加屬性的總和
  • 在這種映射策略下,既不需要使用辨別者列,也無需使用key元素來映射共有主鍵
  • 使用union-subclass映射策略是不可使用identity的主鍵生成策略。因為同一類繼承層次中的所有實體類都需要使用同一個主鍵種子,即多個持久化實體對應的記錄的主鍵應該是連續的,,受此影響,也不該使用native主鍵生成策略,因為native會根據數據庫來選擇使用identity或sequence

Person.hbm.xml

 1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 4 <!-- Generated 2014-11-30 9:34:50 by Hibernate Tools 3.4.0.CR1 --> 5 <hibernate-mapping package="com.yl.hibernate.union.subclass"> 6     <class name="Person" table="PERSONS"> 7         <id name="id" type="java.lang.Integer"> 8             <column name="ID" /> 9             <generator class="hilo" />10         </id>11         12         <property name="name" type="java.lang.String">13             <column name="NAME" />14         </property>15         <property name="age" type="int">16             <column name="AGE" />17         </property>18         <!-- 映射子類Student, 使用union-subclass進行映射 -->19         <union-subclass name="Student" table="STUDENTS">20             <property name="school" type="string" column="SCHOOL"></property>21         </union-subclass>22         23        24         25     </class>26 </hibernate-mapping>


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 庆阳市| 新丰县| 桂东县| 台东县| 文安县| 霍山县| 如东县| 馆陶县| 饶阳县| 凤城市| 丹棱县| 图片| 周宁县| 渭源县| 大方县| 彭阳县| 道孚县| 绵阳市| 阿坝县| 社旗县| 方正县| 连云港市| 长沙县| 习水县| 沾益县| 南雄市| 涟水县| 永德县| 瑞安市| 灵台县| 确山县| 延长县| 余江县| 浦县| 乌拉特后旗| 天津市| 南平市| 枣阳市| 高台县| 都兰县| 鸡泽县|