hibernate學習小結

    學習之餘,把hibernate的知識點稍作小結。我們知道,Hibernate是一個開放源代碼的對象關係映射框架,它對JDBC進行了輕量級的對象封裝,使得我們可以很容易地使用對象編程思維來訪問數據庫。它可以應用在任何使用JDBC的場合,既可以在Java的客戶端程序使用,也可以在Servlet/JSP的Web應用中使用。下面即是對hibernate各模塊的總結。

一、hibernate工作原理:
    通過在項目中配置nibernate控制文件和類對象對應的映射文件,實現對jdbc的封裝,對javabean類和關係數據庫進行映射,實現了對數據庫的面向對象方式的操作,相比傳統的jdbc + sql操作數據的方式來說,它很大程度地方便了我們的開發。

二、配置hibernate流程:
1.創建一個動態web項目,將hibernate的最新版本和mySql的JDBC驅動庫加到項目中。
2.在項目目錄下創建hibernate的核心控制文件hibernate.cfg.xml,這裏面設定了運行hibernate所必須的相關配置參數。
3.在數據庫中創建一個pojo表,對應地在項目中創建一個pojo類。
4.編寫pojo類對應的映射文件,以便讓hibernate負責對pojo對象到數據庫的存取。將映射文件和文件路徑加入到hibernate.cfg.xml中。
5.編寫一個類,負責從數據庫中取到與數據庫的連接對象session。
6.編寫實現pojo對象的數據庫訪問類,實現對pojo對象的訪問數據庫操作。
7.測試。

三、hibernate工作流程:
1.新建一個pojo對象。
2.取到hibernate中的session對象。
3.通過session對象開啓事務。
4.session從hibernate控制文件中找到將要訪問的數據庫,連接上數據庫。再找到pojo類所對應的映射文件,將項目中的pojo類映射到數據庫中的pojo表。
5.session將對pojo對象的操作結果保存到數據庫中。
6.最後關閉session,結束訪問數據庫操作。
7.測試結果中可以看到hibernate得到的對應的數據庫訪問操作。

四、延遲加載:
    一般情況訪問數據庫操作中,讀取一個對象時會將與這個對象所有相關的其他對象一起讀取出來,但問題是並非所有的數據對我們來講是有用的,也許我們想要的只是一個對象,但讀取到的可能是很多個對象,這經常會導致整個數據庫都在初始化的階段被讀出來了。而Hibernate的延遲加載機制很好地解決了這個問題。hibernate的延遲加載只在一個對象調用它的一對多或多對多關係時纔將關係對象讀取出來。這個過程只進行了很少的數據庫操作請求,因此會得到比較明顯的性能提升。
    但這種延遲加載的缺陷是Hibernate會話要在對象使用的時候一直開着。而爲了將持久化機制完全地抽象出來,所有的數據庫邏輯,包括打開或關閉會話,都不能在應用層出現。另一種解決方法是spring框架下的延遲加載。Spring框架爲Hibernate延遲加載與DAO模式的整合提供了一種方便的解決方法。Spring提供了OpenSessionInViewFilter和OpenSessionInViewInterceptor。我們可以隨意選擇一個類來實現相同的功能。Filter在Spring之前運行並被配置在web.xml中,而interceptor在Spring容器中運行並被配置在web應用的上下文中。這兩種都在請求將當前會話與當前(數據庫)線程綁定時打開Hibernate會話。

五、主鍵生成機制:
  hibernate中存在多種主鍵,不同的主鍵生成方式也不盡相同。
1.Assigned:主鍵的生成值由我們自己決定,而與數據庫無關,我們只需要在調用session.save()之前要指定它的主鍵值就行。
2.Hilo:Hilo主鍵生成方式由Hibernate 維護,與底層數據庫無關。需要額外的數據庫表的支持,能保證同一個數據庫中主鍵的唯一性,但不能保證多個數據庫之間主鍵的唯一性。3.Increment:由Hibernate本身維護,適合單一進程訪問數據庫。對主鍵值採取自動增長的方式生成新的主鍵值。
4.Identity:與底層數據庫有關,要求數據庫支持Identity,無需Hibernate和用戶的干涉,使用較爲方便,但不便於在不同的數據庫之間移植程序。根據底層數據庫支持自動增長。5.Sequence:需要底層數據庫支持Sequence方式,從支持序列的數據庫移植到不支持序列的數據庫需要修改配置文件。
6.Native:主鍵生成方式會根據不同的底層數據庫自動選擇Identity、Sequence、Hilo主鍵生成方式。項目中如果用到多個數據庫時,可以使用這種方式。
7.UUID:使用128位UUID算法生成主鍵,能夠保證網絡環境下的主鍵唯一性,也就能夠保證在不同數據庫及不同服務器下主鍵的唯一性。
8.Foreign GUID:多用於一對一關係中。GUID主鍵生成方式使用了一種特殊算法,保證生成主鍵的唯一性。

六、hibernate中的對象狀態:
1.自由狀態:通過new創建的一個對象,還未在數據庫中持久化,也沒有與session進行關聯。此時的對象沒有數據庫中對應的ID。
2.持久狀態:對象已經被保存到數據庫中,並且與之關聯的session對象還未關閉。
3.遊離狀態:對象保存到數據庫後脫離了session的管理,或者說session已經關閉。
4.移除狀態:調用了通過session的delete()或remove()方法從數據庫中移除掉的對象。

七、hibernate的悲觀鎖和樂觀鎖:
悲觀鎖:操作數據之前就鎖定數據,以防止其他應用破壞事務。因爲考慮到對壞情況,故被稱爲悲觀鎖。它在查詢數據庫之前調用setLockMode()方法,設定鎖定模式。
樂觀鎖:與悲觀鎖相反,樂觀鎖是當前事務在操作數據時並不鎖定數據,而是在提交數據時進行檢查提交的數據是否被改動,不改動則成功提交,否則事務失敗。

八、hibernate核心接口:
1.Session:負責執行被持久化對象的CRUD操作。
2.SessionFactory:負責創建Session對象並初始化Hibernate。一般情況下,一個項目通常只需要一個SessionFactory。
3.Configuration:負責配置並啓動Hibernate,創建SessionFactory對象。在Hibernate的啓動的過程中,Configuration類的實例首先定位映射文檔位置、讀取配置,然後創建SessionFactory對象。
4.Transaction:負責事務相關的操作。
5.Query和Criteria:負責執行各種數據庫查詢。

    希望一點小小的總結能對學習hibernate的同志們和我自己一點幫助。
發佈了33 篇原創文章 · 獲贊 11 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章