熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

精通Hibernate之映射繼承關系八

2022-06-13   來源: Java開源技術 

  由於關系數據模型不允許一個表的外鍵同時參照兩個表的主鍵因此無法對TABLE_D表的A_ID字段定義外鍵參照約束而應該通過其他方式如觸發器來保證A_ID字段的參照完整性由於TABLE_D表的A_ID字段既可能參照TABLE_B表的ID主鍵也可能參照TABLE_C表的ID主鍵要求TABLE_B表和TALBE_C表的ID主鍵具有相同的SQL類型
  
  在ClassDhbmxml文件中用元素來映射ClassD的a屬性
  
  <any name=a
  metatype=string
  idtype=long
  cascade=saveupdate>
  <metavalue value=B class=ClassB />
  <metavalue value=C class=ClassC />
  <column name=A_TYPE />
  <column name=A_ID />
  </any>
  
  元素的metatype屬性指定TABLE_D中A_TYPE字段的類型idtype屬性指定TABLE_D中A_ID字段的類型子元素設定A_TYPE字段的可選值在本例中如果A_TYPE字段取值為B表示為ClassB的對象A_ID字段參照TABLE_B表中的ID主鍵如果A_TYPE字段取值為C表示為ClassC的對象A_ID字段參照TABLE_C表中的ID主鍵子元素指定TABLE_D表中的A_TYPE字段和A_ID字段必須先指定A_TYPE字段再指定A_ID字段
  
  小結
  
  本章介紹了映射繼承關系的三種方式
  
  繼承關系樹的每個具體類對應一個表在具體類對應的表中不僅包含和具體類的屬性對應的字段還包含和具體類的父類的屬性對應的字段這種映射方式不支持多態關聯和多態查詢
  
  繼承關系樹的根類對應一個表在根類對應的表中不僅包含和根類的屬性對應的字段還包含和所有子類的屬性對應的字段
  
  這種映射方式支持多態關聯和多態查詢並且能獲得最佳查詢性能缺點是需要對關系數據模型進行非常規設計在數據庫表中加入額外的區分各個子類的字段此外不能為所有子類的屬性對應的字段定義not null約束
  
  繼承關系樹的每個類對應一個表在每個類對應的表中只需包含和這個類本身的屬性對應的字段子類對應的表參照父類對應的表
  
  這種映射方式支持多態關聯和多態查詢而且符合關系數據模型的常規設計規則缺點是它的查詢性能不如第二種映射方式在這種映射方式下必須通過表的內連接或左外連接來實現多態查詢和多態關聯
  
  在默認情況下對於簡單的繼承關系樹可以采用根類對應一個表的映射方式如果必須保證關系數據模型的數據完整性可以采用每個類對應一個表的映射方式對於復雜的繼承關系樹可以將它分解為幾棵子樹對每棵子樹采用不同的映射方式
  
  當然在設計域模型時應該盡量避免設計過分復雜的繼承關系這不僅會增加把域模型映射到關系數據模型的難度而且也會增加在Java程序代碼中操縱持久化對象的復雜度
  
  對於不同的映射方式必須創建不同的關系數據模型和映射文件但是域模型是一樣的域模型中的持久化類的實現也都一樣
  
  只要具備Java編程基礎知識就能創建具有繼承關系的持久化類因此本章沒有詳細介紹這些持久化類的創建過程在此僅提醒一點子類的完整構造方法不僅負責初始化子類本身的屬性還應該負責初始化從父類中繼承的屬性例如以下是HourlyEmployee類的構造方法
  
  public class HourlyEmployee extends Employee{
  private double rate;
  
  /** 完整構造方法*/
  public HourlyEmployee(String name double rateCompany company) {
  super(namecompany);
  thisrate=rate;
  }
  
  /** 默認構造方法*/
  public HourlyEmployee() {}
  ……
  }
  
  Hibernate只會訪問持久化類的默認構造方法永遠不會訪問其他形式的構造方法提供以上形式的完整構造方法主要是為Java應用的編程提供方便
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28491.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.