亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

Hibernate中any元素的應用體會

2019-11-18 12:57:41
字體:
來源:轉載
供稿:網友

  Hibernate中any元素的應用體會
  
  關聯(Associations)是Hibernate核心概念之一,比較常用的有:
  
  many-to-one, one-to-one, one-to-many, many-to-many
  
  Hibernate還提供了另外一種關聯——異類關聯(Heterogeneous Associations)
  
  在Hibernate Reference (cn) 2.1.6中是這樣說明的:
  
  引用:
  
  6.10. 異類關聯(Heterogeneous Associations)
  
  <many-to-any>和<index-many-to-any>元素提供真正的異類關聯。這些元素和<any>元素工作方式是同樣的,他們都應該很少用到。
  
  下面針對<any>元素,談一些自己的體會。
  
  一、什么時候需要<any>元素
  
  持久類中“一個屬性”關聯“另外一個指定的持久類”(幾乎每個應用都有這種情況),多半會使用many-to-one, one-to-one這樣的關聯。映射到關系數據庫中,也多半使用外鍵約束。
  
  可能會碰到有這么一種非凡的情況,需要:持久類中“一個屬性”關聯“另外一些持久類”。
  
  舉個例子:Log類中使用logEntity屬性關聯一組業務持久類。(也就是說,在Log中記錄不同業務類的實例對象)
  
  假如使用many-to-one,則有很大的限制。首先,需要這些業務類都要繼續一個超類,而且在數據庫中必須有這個超類對應的表。在Hibernate提供的三種繼續映射策略中,只能使用前兩種:
  
  1、“每棵類繼續樹使用一個表(table per class hierarchy) ”
  
  2、“每個子類一個表(table per subclass)”
  
  第1種通常不大合適:所有的業務類映射為一張表,冗余過多,限制也多,增加一個業務類就需要修改表結構,不易擴展。
  
  第2種的情況是:表的數量=業務表數量 + 一個超類表,子類表通過主鍵和超類表關聯(所以實際上關系模型是一對一關聯)。業務表數量比較多的時候,這種結構的性能和靈活性都有問題。
  
  這時<any>元素就派上用場啦。
  
  二、<any>元素的應用
  
  1、類:
  
  業務類:
  java代碼:
  
  public class BizOne {
  PRivate Long    id;
  private String    bizOneDescription;
  //Getters and Setters 省略
  }
  public class BizTwo {
  private Long    id;
  private String    bizTwoDescription;
  private Date  createDate;
  //Getters and Setters 省略
  }
  
  日志類:
  java代碼:
  
  public class MyLog {
  private Long    id;
  private Date    logDate;
  private Object    logEntity;    //這就是<any>元素對應的屬性。
  //Getters and Setter 省略
  }
  
  2、hbm.xml 和 表結構:
  
  這里只給出MyLog的hbm.xml(BizOne, BizTwo很簡單,不提了):
  
  java代碼:
  
  <hibernate-mapping>
  <class name="com.test.entity.MyLog" table="MyLog">
  <id name="id" column="id">
  <generator class="native"/>
  </id>
  <property name="logDate"/>
  <any name="logEntity" meta-type="string" id-type="long">
  <meta-value value="One" class="com.test.entity.BizOne"/>
  <meta-value value="Two" class="com.test.entity.BizTwo"/>
  <column name="entityMetaValue" length="20" />
  <column name="entityId"/>
  </any>
  </class>
  </hibernate-mapping>
  
  表結構(MySQL):
  java代碼:
  
  create table MyLog (
  id BIGINT NOT NULL AUTO_INCREMENT,
  logDate datetime,
  entityMetaValue VARCHAR(20),
  entityId BIGINT,
  primary key (id)
  )
  
  對<any>元素中子元素和屬性的理解,可以結合生成的表結構,及其表中的數據(見3):
  
  name: 是持久類中屬性名稱。
  meta-type: 是下面meta-value元素中value的類型,如"string","character"等。
  id-type: 是引用類的主鍵類型。
  meta-value元素中value: 該值將保存到數據庫表中,用來標識其后的class,即引用的持久類。請參考下面的數據。
  meta-value元素中class: 引用持久類的類全稱。
  
  第一個column: 保存上面value值的字段。
  
  第二個column: 保存引用持久類的主鍵值的字段,它的類型是id-type對應到數據庫中的字段類型。
  
  3、記錄日志的方法:
  
  java代碼:
  
  public MyLog recordLog(Object biz){
  MyLog log = new MyLog();
  log.setLogDate(new Date());
  log.setLogEntity(biz);    //引用了傳遞過來的業務對象
  
  return getLogService().save(log);    //保存log。我習慣用Spring+Hibernate。
  }
  
  Hibernate所保存的數據是這樣:
  
  引用:
  
  --  ---------------------------------  ---------------   --------
  id  logDate           entityMetaValue entityId
  --  ---------------------------------  ---------------   --------
  1  2004-11-15 20:48:52.211  One        1
  2  2004-11-15 20:57:25.385  Two        2
  3  2004-11-15 21:48:52.211  One        15
  4  2004-11-15 22:51:15.185  Two        26
  5  2004-11-15 23:27:55.123  Two        36
  
  4、讀取Log
  java代碼:
  
  public MyLog readLog(Long id){
  MyLog log = getLogService().getLog(id);
  
  Object biz = log.getLogEntity();
  //...
  
  return log;
  }
  
  用<any>所實現的關聯,與<many-to-one>等關聯的效果是相同的。例如,假如BizOne, BizTwo的lazy="true",則biz是個代理。
  
  5、BizThree假如增加了一個業務類BizThree,在MyLog.hbm.xml中只需增加一行:
  
  java代碼:
  
  <meta-value value="Three" class="com.test.entity.BizThree"/>
  
  6、限制
  
  在<any>元素中需要指定id-type,這可能是<any>對所關聯類的唯一限制了:所關聯的類的主鍵類型必須相同。
  
  三、再談繼續映射策略問題
  
  上面提到了:假如為了讓Log能夠關聯業務類,就要求業務類都要繼續同一個超類,是不大合適的。不過,不合適的理由在于這個超類需要在數據庫有相應的表。不能說,業務類不能繼續一個超類。實際上,很多應用中的業務類都有超類,而且根據情況實現一些接口。此時的繼續映射策略是Hibernate Reference中的第三種:每個具體類一個表(table per concrete class)。上面MyLog中的logEntity的類型可以是更有意義的超類,如Entity,當然也可以是接口,不必是Object。這樣,即使超類在數據庫中沒有對應的表,照樣可以實現關聯。
  
  四、彩票
  
  Hibernate Reference中提到<any>元素的地方不是很多,但提到時,總不忘記說“應該很少用到”,“應該在非常非凡的情況下使用它”??赡軓娜澜绲慕嵌瓤矗褂?lt;any>是低概率事件,但是假如碰到了,就是100%的概率了。因此,當你應用<any>的時候,別忘了購買彩票。因為,與中獎同樣的低概率事件——使用<any>——你已經碰到了,你的運氣就來了,趕緊買彩票吧,準能中獎!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧洲av一区二区| 揄拍成人国产精品视频| 色综合色综合网色综合| 亚洲人成伊人成综合网久久久| 日韩免费在线播放| 国产一区二区美女视频| 性夜试看影院91社区| 国产精品扒开腿做爽爽爽的视频| 中文字幕亚洲精品| 最近2019中文字幕第三页视频| 国产成人涩涩涩视频在线观看| 国产一区二区三区三区在线观看| 欧美午夜女人视频在线| 91经典在线视频| 韩剧1988免费观看全集| 国产午夜精品美女视频明星a级| 亚洲欧美精品中文字幕在线| 538国产精品一区二区在线| 久久999免费视频| 亚洲专区中文字幕| 日韩在线不卡视频| 国产欧美精品xxxx另类| 国产91成人在在线播放| 日韩av在线播放资源| 国产97色在线| 精品国偷自产在线视频99| 国产亚洲精品成人av久久ww| 国产欧美一区二区三区视频| 欧美激情免费看| 98视频在线噜噜噜国产| 97成人精品区在线播放| 91a在线视频| 成人黄色av免费在线观看| 国产精品稀缺呦系列在线| 欧美日韩精品二区| 日韩欧美在线中文字幕| 国产国产精品人在线视| 中文综合在线观看| 亚洲国产欧美在线成人app| 国产精品自拍偷拍视频| 国内精品国产三级国产在线专| 中文字幕久热精品视频在线| 国产欧美日韩精品在线观看| 久久久久久久久久婷婷| 伊人久久久久久久久久久久久| 中文字幕在线国产精品| 国产精品福利在线观看| 黄网动漫久久久| 91探花福利精品国产自产在线| 亚洲成人av片在线观看| 成人观看高清在线观看免费| 久久精品国产久精国产思思| 国产日韩欧美夫妻视频在线观看| 成人综合国产精品| 国产精品你懂得| 日韩激情av在线免费观看| 日韩欧美在线第一页| 日韩在线观看免费全集电视剧网站| 亚洲xxxxx电影| 欧美激情成人在线视频| 欧美精品激情blacked18| 久久免费视频网站| 91亚洲永久免费精品| 欧美一级大片在线免费观看| 欧美日韩国产成人在线观看| 久久久久久69| 欧美性生交大片免费| 久久国产一区二区三区| 热久久免费视频精品| 色综合久久精品亚洲国产| 欧美日韩高清区| 91精品国产免费久久久久久| www.亚洲男人天堂| 久久亚洲精品网站| 美女黄色丝袜一区| 韩国美女主播一区| 久久久久久久久电影| 精品久久久香蕉免费精品视频| 亚洲国产天堂久久综合| 91久久久久久久久久久久久| 日韩精品免费一线在线观看| 国产精品444| 亚洲天堂久久av| 午夜精品理论片| 国产日韩欧美一二三区| 国产美女精品视频| 日韩在线不卡视频| 日韩激情av在线免费观看| 菠萝蜜影院一区二区免费| 日韩精品免费在线播放| 久久久久久18| 福利一区福利二区微拍刺激| 国产精品亚洲自拍| 欧美性色19p| 欧美日韩国产精品一区| 在线观看免费高清视频97| 日韩精品中文在线观看| 久久天天躁狠狠躁夜夜躁2014| 中文字幕国产精品久久| 668精品在线视频| 亚洲精品免费av| 日韩精品福利网站| 国产精品电影在线观看| 97在线视频免费播放| 亚洲成人亚洲激情| 91最新国产视频| 国产成人精品久久久| 日韩成人久久久| 欧美大奶子在线| 国产精品亚洲视频在线观看| 成人免费在线网址| 欧美性猛交丰臀xxxxx网站| 57pao国产精品一区| 欧美精品九九久久| 久久综合久中文字幕青草| 成人国产精品色哟哟| 精品国产一区二区三区四区在线观看| 亚洲jizzjizz日本少妇| 欧美在线视频网| 色樱桃影院亚洲精品影院| 久久久久免费视频| 色综合色综合久久综合频道88| 日日摸夜夜添一区| 国产91精品久久久久| 国产在线视频一区| 国产精品视频网| 亚洲桃花岛网站| 91天堂在线视频| 久久视频免费观看| 欧美福利视频网站| 4438全国亚洲精品在线观看视频| 在线视频中文亚洲| 亚洲无亚洲人成网站77777| 久久99国产综合精品女同| 欧美高清自拍一区| 国产成+人+综合+亚洲欧美丁香花| 日韩精品视频在线播放| 精品国产31久久久久久| 欧美重口另类videos人妖| 国产精品27p| 日韩一区二区在线视频| 欧美在线视频网站| zzjj国产精品一区二区| 亚洲福利在线视频| 91在线观看免费高清| 国产欧美久久一区二区| www.亚洲成人| 最近的2019中文字幕免费一页| 国产999在线观看| 精品久久久香蕉免费精品视频| 亚洲美女久久久| 欧美性高潮床叫视频| www.久久久久久.com| 欧美在线www| 久久噜噜噜精品国产亚洲综合| 91精品久久久久久久久久另类| 亚洲精品美女久久| 日韩免费在线视频| 日韩精品免费在线视频观看| 国产精品wwwwww| 欧美极品少妇xxxxⅹ免费视频| 国产精品老女人视频| 成人性生交大片免费看小说| 国产一区二区久久精品|