- 本文講述了Hibernate3的工作原理,分爲三個部分進行講 述:Hibernate3 的初始化、Hibernate3 的緩存體系以及Hibernate3 中Java對象的狀態。
一、Hibernate3 的初始化
讀取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 接口提供的各種方法來操縱數據庫訪問。
二、
Hibernate3 的緩存體系:
一級緩存:
Session
有一個內置的緩存,其中存放了被當前工作單元加載的對象。每個Session 都有自己獨立的緩存,且只能被當前工作單元訪問。
二
級緩存:
SessionFactory的外置的可插拔的緩存插件。其中的數據可被多個Session共享訪問。
SessionFactory的內置緩存:存放了映射元數據,預定義的Sql語句。
三、Hibernate3 中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的緩存機制是怎麼實現
的,Hibernate在封裝JDBC和JTA時都做了些什麼,其ORM是怎麼實現的等等。要弄清這些東西估計需要很長時間的摸索和積累,也只有在實際應
用中不斷加深對它們的理解了:)下面,我將最近兩天的收穫總結一下,主要敘述一下Hibernate的基本工作原理。對於Hibernate的緩存機制、
基於JDBC和JTA的事務處理及其ORM的實現等技術,以後慢慢再補吧。
所謂Hibernate的基本工作原理,換言之,也就是Hibernate大體的工作流程。在這裏,我們仿照前面對Struts基本原理的闡述方 法,僅將其原理圖呈現給大家,詳細文字說明在此略過(個人認爲這張圖對Hibernate基本工作過程的敘述已經足夠全面了,所以沒必要再用文字說明,如 果還是不明白,請您給我留言或者查看相關資料)。
本文摘自:http://developer.51cto.com/art/200906/129633.htm