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

精通Hibernate之映射繼承關系七(圖)

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

  Company與Employee類之間為一對多多態關聯關系如果繼承關系樹的根類對應一個表或者每個類對應一個表那麼就能映射Company類的employees集合本節介紹如何映射多對一多態關聯如圖所示ClassD與ClassA為多對一多態關聯關系
  
 

  
ClassD與ClassA為多對一多態關聯關系

  
  ClassAClassB和ClassC構成了一棵繼承關系樹如果繼承關系樹的根類對應一個表或者每個類對應一個表那麼可以按以下方式映射ClassD的a屬性
  
  <manytoone name=a
  class=ClassA
  column=A_ID
  cascade=saveupdate />
  
  假定與ClassD對應的表為TABLE_D與ClassA對應的表為TABLE_A在TABLE_D中定義了外鍵A_ID它參照TABLE_A表的主鍵
  
  ClassD對象的a屬性既可以引用ClassB對象也可以引用ClassC對象例如
  
  tx = sessionbeginTransaction();
  ClassD d=(ClassD)sessionget(ClassDid);
  ClassA a=dgetA();
  if(a instanceof ClassB)
  Systemoutprintln(((ClassB)a)getB());
  if(a instanceof ClassC)
  Systemoutprintln(((ClassC)a)getC());
  mit();
  
  以下代碼在映射ClassD類的a屬性時使用了延遲檢索策略
  
  <manytoone name=a
  class=ClassA
  column=A_ID
  lazy=true
  cascade=saveupdate />
  
  當Hibernate加載ClassD對象時它的屬性a引用ClassA的代理類實例在這種情況下如果對ClassA的代理類實例進行類型轉換會拋出ClassCastException
  
  ClassA a=dgetA();
  ClassB b=(ClassB)a; //拋出ClassCastException
  
  解決以上問題的一種辦法是使用Sessionload()方法
  
  ClassA a=dgetA();
  ClassB b=(ClassB)sessionload(ClassBclassagetId());
  Systemoutprintln(bgetB());
  
  當執行Session的load()方法時Hibernate並不會訪問數據庫而是僅僅返回ClassB的代理類實例這種解決辦法的前提條件是必須事先知道ClassD對象實際上和ClassA的哪個子類的對象關聯
  
  解決以上問題的另一種辦法是顯式使用迫切左外連接檢索策略避免Hibernate創建ClassA的代理類實例而是直接創建ClassA的子類的實例
  
  tx = sessionbeginTransaction();
  ClassD d=(ClassD)sessioncreateCriteria(ClassDclass)
  add(Expressioneq(idid))
  setFetchMode(aFetchModeEAGER)
  uniqueResult();
  ClassA a=dgetA();
  if(a instanceof ClassB)
  Systemoutprintln(((ClassB)a)getB());
  if(a instanceof ClassC)
  Systemoutprintln(((ClassC)a)getC());
  mit();
  
  如果繼承關系樹的具體類對應一個表為了表達ClassD與ClassA的多態關聯需要在TABLE_D中定義兩個字段A_ID和A_TYPEA_TYPE字段表示子類的類型A_ID參照在子類對應的表中的主鍵顯示了表TABLE_DTABLE_B和TABLE_C的結構
  
educitycn/img_///jpg>

  
表TABLE_DTABLE_B和TABLE_C的結構

From:http://tw.wingwit.com/Article/program/Java/ky/201311/28679.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.