Hibernate 大綱

  <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 Hibernate

 

 繼承映射 

 

1、每個類繼承樹對應一張表;

    採用這種策略只需要一張表即可。它有一個很大的限制:要求那些由子類定義的字段, 如CCTYPE,不能有非空(NOT NULL)約束

 

2、每個子類一張表 ;

    需要四張表。三個子類表通過主鍵關聯到超類表(因而關係模型實際上是一對一關聯)。

 

3、每個具體子類一張表;

    第一種方法是使用 <union-subclass>:這種方式的侷限在於,如果一個屬性在超類中做了映射,其字段名必須與所有子類 表中定義的相同

    另一種可供選擇的方法是採用隱式多態:這種方法的缺陷在於,在Hibernate執行多態查詢時(polymorphic queries)無法生成帶 UNION的SQL語句。

 

繼承策略(Inheritance strategy) 多態多對一 多態一對一 多態一對多 多態多對多 多態 load()/get() 多態查詢 多態連接(join) 外連接(Outer join)讀取
每個類分層結構一張表 <many-to-one> <one-to-one> <one-to-many> <many-to-many> s.get(Payment.class, id) from Payment p from Order o join o.payment p 支持
每個子類一張表 <many-to-one> <one-to-one> <one-to-many> <many-to-many> s.get(Payment.class, id) from Payment p from Order o join o.payment p 支持
每個具體類一張表(union-subclass) <many-to-one> <one-to-one> <one-to-many> (僅對於inverse="true"的情況) <many-to-many> s.get(Payment.class, id) from Payment p from Order o join o.payment p 支持
每個具體類一張表(隱式多態) <any> 不支持 不支持 <many-to-any> s.createCriteria(Payment.class).add( Restrictions.idEq(id) ).uniqueResult() from Payment p 不支持 不支持

 

 組合映射  : <component> 元素還允許有 <parent>子元素 

   1、聯合主鍵:   <composite-id> 標籤(並且內嵌<key-property>元素)

  2、動態組件:  <dynamic-component name="userAttributes">

  3、組件集合: <composite-element>  <nested-composite-element>  <composite-map-key>

   4、 三重或多重關聯  <many-to-one>  many-to-many 

  

 集合映射

       Hibernate中的集合分爲五類: 
            1.bag類:元素無序,可重複 
            2.set類:元素無序,不可重複 
            3.list類:元素有序,可重複 
            4.array類:數組 
            5.map類:映射關係 
        除bag類集合外,其它集合都可以在java api中找到對應的接口類,bag可以認爲對應java中的List 
        Hibernate中將集合分爲3類: 
            一是值集合,集合中存儲的都是基本數據類型,包括String類型,及其它可識別的數據庫類型  <element>
            二是實體集合,集合中存儲已經映射了的實體對象,反應對象間的關係。(一對多 和 多對多

            三是組件集合 <composite-element>

        <idbag>  聯合主鍵

    

       集合排序: 1. 在數據庫排序 order by   2. 在內存中排序 sort  自然排序 或者 客戶化排序

       過濾集合

    Collection blackKittens = session.createFilter(
        pk.getKittens(),
        "where this.color = ?")
        .setParameter( Color.BLACK, Hibernate.custom(ColorUserType.class) )
        .list()
    );

        集合性能優化

        <idbag>映射定義了代理鍵,因此它總是可以很高效的被更新。事實上, <idbag>擁有着最好的性能表現

        Bag是最差的。因爲bag允許重複的元素值,也沒有索引字段,因此不可能定義主鍵。 Hibernate無法判斷出重複的

        行。當這種集合被更改時,Hibernate將會先完整地移除 (通過一個(in a single DELETE))整個集合,然後再重新

        創建整個集合。 因此Bag是非常低效的。

        可論證的是對於多對多關聯、值數據集合而言,有序集合類比集合(set)有一個好處。

        數組無法延遲載入,我們可以得出結論,list, map和idbags是最高效的(非反向)集合類型,set則緊隨其後。

 

 關聯映射

1.      單向多對一關聯最常見的單向關聯關係

2.      基於外鍵關聯的單向一對多關聯是一種很少見的情況,並不推薦使用

3.      基於連接表的單向一對多關聯 應該優先被採用 請注意,通過指定unique="true",我們可以把多樣性從多對多改變爲一對多

4.      基於連接表的單向多對一關聯在關聯關係可選的情況下應用也很普遍

5.      雙向多對一/一對多關聯最常見的關聯關係。(這也是標準的父/子關聯關係。)

6.      雙向一對多自身關聯(樹形結構)

7.      基於連接表的雙向一對多/多對一關聯注意inverse="true"可以出現在關聯的任意一端,即collection端或者join

 

8.      基於外鍵關聯的單向一對一關聯單向多對一關聯幾乎是一樣的。唯一的不同就是單向一對一關聯中的外鍵字段具有唯一性約束

9.      基於主鍵關聯的單向一對一關聯通常使用一個特定的id生成器

10.   基於外鍵關聯的雙向一對一關聯也很常見

11.   基於主鍵關聯的雙向一對一關聯需要使用特定的id生成器

12.   基於連接表的雙向一對一關聯極爲罕見,但也是可行的

13.   基於連接表的單向一對一關聯非常少見,但也是可行的

 

14.   最後,還有 單向多對多關聯.

15.   最後,還有 雙向多對多關聯.

    

   

                               

 操作持久化類

            對象的三種狀態   

            session的清理緩存flash() 時間點  三種模式

            sessionget() load() find(SQL) 這三個的區別    save()  saveOrUpdate()  update()  merge()

                                                      delete()   close()  evict()  lock()  persist()

            級聯操縱對象圖    saveOrUpdate()   iterator()    cacade屬性

 

 檢索策略

            三種檢索策略  (另外 批量檢索)   lazy屬性  outer-join屬性  batch-size屬性

            迫切左外連接的限制  和 配置  顯示設置(HQL)   

            iterator() 與 list()  遍歷對象圖

            HQL   SQL    多態查詢  分頁查詢   連接查詢  報表查詢   高級查詢   查詢性能優化  

          批量處理    batch-size屬性

 

 攔截器(安全)  事件框架    事務 併發

 

八.    緩存

一級緩存   二級緩存   查詢緩存   管理緩存   集合緩存

 

 九配置

 

 Spring 集成 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章