Hibernate-回顧與總結

        ITOO項目中數據庫操作層用到的東西很多,包括EclipseLink等ORM框架也包括sql,對Hibernate的瞭解曾學習過,但是深入認識是在最近的應用開發框架中,通過--Criteria 這一個一種比hql更面向對象的查詢方式,讓提醒自己再次的學習Hibernate。

定義:

       Hibernate是一個開放源代碼的對象關係映射框架,它對JDBC進行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫。 Hibernate可以應用在任何使用JDBC的場合,既可以在Java的客戶端程序使用,也可以在Servlet/JSP的Web應用中使用,最具革命意義的是,Hibernate可以在應用EJB的J2EE架構中取代CMP,完成數據持久化的重任。

核心接口和類

     包括6個分別爲:Session、SessionFacotry、Transaction、Query、Criteria和Configuration。

      Session

      Session接口負責執行被持久化對象的CRUD操作。但需要注意的是Session對象是非線程安全的。同時,Hibernate的session不同於JSP應用中的HttpSession。這裏當使用session這個術語時,其實指的是Hibernate中的session,而以後會將HttpSession對象稱爲用戶session。

SessionFactory

      SessionFactory接口負責初始化Hibernate。它充當數據存儲源的代理,並負責創建Session對象。這裏用到了工廠模式。需要注意的是SessionFactory並不是輕量級的,因爲一般情況下,一個項目通常只需要一個SessionFactory就夠,當需要操作多個數據庫時,可以爲每個數據庫指定一個SessionFactory。

Transaction

      Transaction 接口是一個可選的API,可以選擇不使用這個接口,取而代之的是Hibernate 的設計者自己寫的底層事務處理代碼。 Transaction 接口是對實際事務實現的一個抽象,這些實現包括JDBC的事務、JTA 中的UserTransaction、甚至可以是CORBA 事務。之所以這樣設計是能讓開發者能夠使用一個統一事務的操作界面,使得自己的項目可以在不同的環境和容器之間方便地移植。

Query

       Query接口讓你方便地對數據庫及持久對象進行查詢,它可以有兩種表達方式:HQL語言或本地數據庫的SQL語句。Query經常被用來綁定查詢參數、限制查詢記錄數量,並最終執行查詢操作。

Criteria

    Criteria接口與Query接口非常類似,允許創建並執行面向對象的標準化查詢。值得注意的是Criteria接口也是輕量級的,它不能在Session之外使用。

Configuration

      Configuration 類的作用是對Hibernate 進行配置,以及對它進行啓動。在Hibernate 的啓動過程中,Configuration 類的實例首先定位映射文檔的位置,讀取這些配置,然後創建一個SessionFactory對象。雖然Configuration 類在整個Hibernate 項目中只扮演着一個很小的角色,但它是啓動hibernate 時所遇到的第一個對象。

  主鍵

Assigned

       Assigned方式由用戶生成主鍵值,並且要在save()之前指定否則會拋出異常
特點:主鍵的生成值完全由用戶決定,與底層數據庫無關。用戶需要維護主鍵值,在調用session.save()之前要指定主鍵值。

Hilo
      Hilo使用高低位算法生成主鍵,高低位算法使用一個高位值和一個低位值,然後把算法得到的兩個值拼接起來作爲數據庫中的唯一主鍵。Hilo方式需要額外的數據庫表和字段提供高位值來源。默認情況下使用的表是
hibernate_unique_key,默認字段叫作next_hi。next_hi必須有一條記錄否則會出現錯誤。

      特點:需要額外的數據庫表的支持,能保證同一個數據庫中主鍵的唯一性,但不能保證多個數據庫之間主鍵的唯一性。Hilo主鍵生成方式由Hibernate 維護,所以Hilo方式與底層數據庫無關,但不應該手動修改hi/lo算法使用的表的值,否則會引起主鍵重複的異常。

Increment

       Increment方式對主鍵值採取自動增長的方式生成新的主鍵值,但要求底層數據庫的主鍵類型爲long,int等數值型。主鍵按數值順序遞增,增量爲1。
      特點:由Hibernate本身維護,適用於所有的數據庫,不適合多進程併發更新數據庫,適合單一進程訪問數據庫。不能用於羣集環境。

Identity

       Identity方式根據底層數據庫,來支持自動增長,不同的數據庫用不同的主鍵增長方式。

      特點:與底層數據庫有關,要求數據庫支持Identity,如MySQl中是auto_increment, SQL Server 中是Identity,支持的數據庫有MySql、SQL Server、DB2、Sybase和HypersonicSQL。 Identity無需Hibernate和用戶的干涉,使用較爲方便,但不便於在不同的數據庫之間移植程序。

Sequence
         Sequence需要底層數據庫支持Sequence方式,例如Oracle數據庫等
         特點:需要底層數據庫的支持序列,支持序列的數據庫有DB2、PostgreSql、Oracle、SAPDb等在不同數據庫之間移植程序,特別從支持序列的數據庫移植到不支持序列的數據庫需要修改配置文件。

Native
       Native主鍵生成方式會根據不同的底層數據庫自動選擇Identity、Sequence、Hilo主鍵生成方式
特點:根據不同的底層數據庫採用不同的主鍵生成方式。由於Hibernate會根據底層數據庫採用不同的映射方式,因此便於程序移植,項目中如果用到多個數據庫時,可以使用這種方式。

UUID
       UUID使用128位UUID算法生成主鍵,能夠保證網絡環境下的主鍵唯一性,也就能夠保證在不同數據庫及不同服務器下主鍵的唯一性。
   特點:能夠保證數據庫中的主鍵唯一性,生成的主鍵佔用比較多的存貯空間。

ForeignGUID

    Foreign用於一對一關係中。GUID主鍵生成方式使用了一種特殊算法,保證生成主鍵的唯一性,支持SQL Server和MySQL

hibernate工作原理:

1、通過Configuration().configure();讀取並解析hibernate.cfg.xml配置文件。
2、由hibernate.cfg.xml中的<mappingresource="com/xx/User.hbm.xml"/>讀取解析映射信息。
3、通過config.buildSessionFactory();//得到sessionFactory。
4、sessionFactory.openSession();//得到session。
5、session.beginTransaction();//開啓事務。
6、persistent operate;
7、session.getTransaction().commit();//提交事務
8、關閉session;
9、關閉sessionFactory;

hibernate延遲加載:

get不支持延遲加載,load支持延遲加載。
1、hibernate2對 實體對象和集合 實現了延遲加載
2、hibernate3對 提供了屬性的延遲加載功能
hibernate延遲加載就是當使用session.load(User.class,1)或者session.createQuery()查詢對象或者屬性的時候
這個對象或者屬性並沒有在內存中,只有當程序操作數據的時候,纔會存在內存中,這樣就實現延遲加載,節省了內存的開銷,從而提高了服務器的性能。

hibernate優點:

1、封裝了jdbc,簡化了很多重複性代碼。
2、簡化了DAO層編碼工作,使開發更對象化了。
3、移植性好,支持各種數據庫,如果換個數據庫只要在配置文件中變換配置就可以了,不用改變hibernate代碼。
4、支持透明持久化,因爲hibernate操作的是純粹的(pojo)java類,沒有實現任何接口,沒有侵入性。所以說它是一個輕量級框架。

       以上內容主要來自於百科,但是對於用過的人來說,總結的及其到位。知識的回顧與深入學習促進自己的認知。

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