在域模型中類與類之間除了關聯關系和聚集關系還可以存在繼承關系在圖所示的域模型中Company類和Employee類之間為一對多的雙向關聯關系(假定不允許雇員同時在多個公司兼職)Employee類為抽象類因此它不能被實例化它有兩個具體的子類HourlyEmployee類和SalariedEmployee類由於Java只允許一個類最多有一個直接的父類因此Employee類HourlyEmployee類和SalariedEmployee類構成了一棵繼承關系樹
圖 包含繼承關系的域模型
在面向對象的范疇中還存在多態的概念多態建立在繼承關系的基礎上簡單地理解多態是指當一個Java應用變量被聲明為Employee類時這個變量實際上既可以引用HourlyEmployee類的實例也可以引用SalariedEmployee類的實例以下這段程序代碼就體現了多態
List employees= businessServicefindAllEmployees();
Iterator it=erator();
while(ithasNext()){
Employee e=(Employee)itnext();
if(e instanceof HourlyEmployee){
Systemoutprintln(egetName()+ +((HourlyEmployee)e)getRate());
}else
Systemoutprintln(egetName()+ +((SalariedEmployee)e)getSalary());
}
BusinessService類的findAllEmployees()方法通過Hibernate API從數據庫中檢索出所有Employee對象findAllEmployees()方法返回的集合既包含HourlyEmployee類的實例也包含SalariedEmployee類的實例這種查詢被稱為多態查詢以上程序中變量e被聲明為Employee類型它實際上既可能引用HourlyEmployee類的實例也可能引用SalariedEmployee類的實例
此外從Company類到Employee類為多態關聯因為Company類的employees集合中可以包含HourlyEmployee類和SalariedEmployee類的實例從Employee類到Company類不是多態關聯因為Employee類的company屬性只會引用Company類本身的實例數據庫表之間並不存在繼承關系那麼如何把域模型的繼承關系映射到關系數據模型中呢?本章將介紹以下三種映射方式
繼承關系樹的每個具體類對應一個表關系數據模型完全不支持域模型中的繼承關系和多態
繼承關系樹的根類對應一個表對關系數據模型進行非常規設計在數據庫表中加入額外的區分子類型的字段通過這種方式可以使關系數據模型支持繼承關系和多態
繼承關系樹的每個類對應一個表在關系數據模型中用外鍵參照關系來表示繼承關系
提示具體類是指非抽象的類具體類可以被實例化HourlyEmployee類和SalariedEmployee類就是具體類
以上每種映射方式都有利有弊本章除了介紹每種映射方式的具體步驟還介紹了它們的適用范圍
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28660.html