第一次接觸Hibernate已經是4年前的事情了,通過myeclipse可以直接產生實體類,甚感架構之神奇,最為神奇的是,習慣使用ibatis之後就再也沒用過Hibernate了。
不得不承認,當習慣了一個方式處理一類事情之後,就總設法用最習慣的方式去面對所有問題了,直到遇到了不得不換種方式的時候,現在就是這個時候了。
好,不多廢話了,開始整理Hibernate
一、Hibernate入門常識:
1. 物件導向設計的軟體內部運行過程可以理解成就是在不斷建立各種新對象、建立對象之間的關係,調用對象的方法來改變各個對象的狀態和對象消亡的過程,不管程式啟動並執行過程和操作怎麼樣,本質上都是要得到一個結果,程式上一個時刻和下一個時刻的運行結果的差異就表現在記憶體中的對象狀態發生了變化。 2. 為了在關機和記憶體空間不夠的狀況下,保持程式的運行狀態,需要將記憶體中的對象狀態儲存到持久化裝置和從持久化裝置中恢複出對象的狀態,通常都是儲存到關聯式資料庫來儲存大量對象資訊。從Java 程式的運行功能上來講,儲存對象狀態的功能相比系統啟動並執行其他功能來說,應該是一個很不起眼的附屬功能,java 採用jdbc 來實現這個功能,這個不起眼的功能卻要編寫大量的代碼,而做的事情僅僅是儲存對象和恢複對象,並且那些大量的jdbc代碼並沒有什麼技術含量,基本上是採用一套例行公事的標準代碼模板來編寫,是一種苦活和重複性的工作。 3. 通過資料庫儲存 java 程式運行時產生的對象和恢複對象,其實就是實現了 java 對象與關聯式資料庫記錄的映射關係,稱為ORM(即Object Relation Mapping),人們可以通過封裝 JDBC代碼來實現了這種功能,封裝出來的產品稱之為 ORM架構,Hibernate 就是其中的一種流行ORM架構。使用 Hibernate 架構,不用寫 JDBC 代碼,僅僅是調用一個 save 方法,就可以將對象儲存到關聯式資料庫中,僅僅是調用一個get方法,就可以從資料庫中載入出一個對象。 4. 使用Hibernate 的基本流程是:配置 Configuration 對象、產生 SessionFactory、建立 session對象,啟動事務,完成CRUD 操作,提交事務,關閉session 。 5. 使用Hibernate 時,先要配置 hibernate.cfg.xml檔案,其中設定資料庫串連資訊和方言等,還要為每個實體配置相應的hbm.xml 檔案,hibernate.cfg.xml檔案中需要登記每個hbm.xml檔案。 6. 在應用Hibernate 時,重點要瞭解 Session的緩衝原理,級聯,消極式載入和 hql 查詢。
細細品讀上面這幾句話,如果沒懂,建議順延學習Hibernate計劃。
二、Hibernate工作原理
Hibernate 的初始化. 讀取Hibernate 的配置資訊-〉建立Session Factory 1)建立Configeration類的執行個體。 它的構造方法:將配置資訊(Hibernate config.xml)讀入到記憶體。 一個Configeration 執行個體代表Hibernate 所有Java類到Sql資料庫映射的集合。 2)建立SessionFactory執行個體 把Configeration 對象中的所有配置資訊拷貝到SessionFactory的緩衝中。 SessionFactory的執行個體代表一個資料庫儲存員源,建立後不再與Configeration 對象關聯。 緩衝(cache):指Java對象的屬性(通常是一些集合類型的屬性--佔用記憶體空間。 SessionFactory的緩衝中:Hibernate 配置資訊。OR映射中繼資料。 緩衝-大:重量級對象 小:輕量級對象 3)調用SessionFactory建立Session的方法 1.使用者自行提供JDBC串連。 Connection con=dataSource.getConnection(); Session s=sessionFactory.openSession(con); 2.讓SessionFactory提供串連 Session s=sessionFactory.openSession(); 4)通過Session 介面提供的各種方法來操縱資料庫訪問。
三、Hibernate緩衝體系
一級緩衝:Session 有一個內建的緩衝,其中存放了被當前工作單元載入的對象。每個Session 都有自己獨立的緩衝,且只能被當前工作單元訪問。二級緩衝:SessionFactory的外置的可插拔的快取區外掛程式。其中的資料可被多個Session共用訪問。SessionFactory的內建緩衝:存放了映射中繼資料,預定義的Sql語句。
四、Hibernate中Java對象狀態
1.臨時狀態 (transient) 特徵:1.不處於Session 緩衝中2.資料庫中沒有對象記錄 Java如何進入臨時狀態1.通過new語句剛建立一個對象時2.當調用Session 的delete()方法,從Session 緩衝中刪除一個對象時。2.持久化狀態(persisted) 特徵:1.處於Session 緩衝中2.持久化對象資料庫中設有對象記錄3.Session 在特定時刻會保持二者同步 Java如何進入持久化狀態1.Session 的save()把臨時->持久化狀態2.Session 的load(),get()方法返回的對象3.Session 的find()返回的list集合中存放的對象4.Session 的update(),saveOrupdate()使游離->持久化3.游離狀態(detached) 特徵:1.不再位於Session 緩衝中2.游離對象由持久化狀態轉變而來,資料庫中可能還有對應記錄。 Java如何進入持久化狀態->游離狀態1.Session 的close()方法2.Session 的evict()方法,從緩衝中刪除一個對象。提高效能。少用。
這個需要看看Hibernate持久對象狀態圖:
五、Hibernate學習建議
根據自身經驗,J2EE架構學習還是以項目為中心,架構只是讓項目更快更好的完成。明白了這一點之後,就需要準備一些相關資料,電子書或圖書館借本厚厚的那些不怎麼常用的但可以當字典使用的書籍。當遇到某個功能無法正常實現是,解決方案建議是
仿照別人代碼--》實現功能--》重構代碼--》查看原理--》記錄心得
總之,學習架構的前提是基礎已經很紮實,需要提高工作效率才應用的,初級程式員建議還是多增加自己有效代碼量,不要過早的去接觸成熟架構。
dml@2012.12.7