Hibernate學習筆記
1、Hibernate核心類與接口
1-1.Configuration類
Configuration類是Hibernate的入口,它負責配置和啟動Hibernate,Hibernate框架通過Configuration實例加載配置文件信息(hibernate.cfg.xml),然后讀取指定對象關系映射文件(bean.hbm.xml)的內容并創建SessionFactory.
1-2.SessionFactory接口
SessionFactory接口負責初始化Hibernate,一個SessionFactory實例對應一個數據存儲源(一般就是指一個數據庫)。應用程序從SessionFactory中獲得Session實例。SessionFactory具有以下特點:
1) 線程安全,即同一個 SessionFactory實例可以被應用 的多個線程共享。
2) 它是重量級的 ,因為它需要一個很大的緩存,用來存放預定義的SQL語句以及映射元數據等。
所以說 ,如果一個應用程序中只訪問一個數據庫 ,則只需要創建一個全局的 SessionFactory實例。
1-3.Session 接口
Session是Hibernate中應用最頻繁的接口。Session也被稱為持久化管理器 ,它負責管理所有與持久化相關的操作:如存儲、更新、刪除和加載對象等。Session接口具有以下特點:
1) 單線程,非共享的對象。線程不安全,在設計軟件架構時候,應該避免多個線程共享同一個session實例。
2) Session 實例是輕量級的,它的創建和銷毀不需要消耗太多的資源。可以為每個請分配一個Session實例,在每次請求過程匯總及時創建和銷毀 Session實例。
3) Session有一個緩存,它存放當前工作單元加載的對象。Session的緩存被稱為Hibernate的一級緩存。
1-4.Transaction接口
Transaction接口是 Hibernate框架的事務接口。它對底層的事務接口做了封裝,包括:JDBC API和JTA.這樣使得Hibernate應用可以通過一致的Transaction接口來申明事務邊界,這有助于應用程序再不同的環境和容器中移植。
1-5.Query和Criteria接口
它們是 Hibernate的查詢接口,用于從數據存儲源查詢對象及控制執行查詢的過程。Query包裝了一個 HQL(Hibernate Query Language);而Criteria接口完全封裝了基本字符串形式的查詢語句,比Query更加面向對象,Criteria接口擅長于執行動態查詢。
2、Hibernate中常用的事務隔離級別
常量
|
值
|
說明
|
TRANSACTION_NONE
|
0
|
不支持事務
|
TRANSACTION_READ_UNCOMMITTED
|
1
|
指示可以發生臟讀(dirty read)、不可重復讀和虛讀(phantom read)的常量。此級別允許被某一事務更改的行在已提交該行所有更改之前被另一個事務讀取(“臟讀”)。如果所有更改都被回滾,則第二個事務將獲取無效的行。
|
TRANSACTION_READ_COMMITTED
|
2
|
指示不可以發生臟讀的常量;不可重復讀和虛讀可以發生。此級別只禁止事務讀取其中帶有未提交更改的行。
|
TRANSACTION_REPEATABLE_READ
|
4
|
指示不可以發生臟讀和不可重復讀的常量;虛讀可以發生。此級別禁止事務讀取帶有未提交更改的行,它還禁止這種情況:一個事務讀取某一行,而另一個事務更改該行,第一個事務重新讀取該行,并在第二次讀取時獲得不同的值(“不可重復讀”)。
|
TRANSACTION_SERIALIZABLE
|
8
|
指示不可以發生臟讀、不可重復讀和虛讀的常量。此級別包括TRANSACTION_REPEATABLE_READ 中禁止的事項,同時還禁止出現這種情況:某一事務讀取所有滿足 WHERE 條件的行,另一個事務插入一個滿足 WHERE 條件的行,第一個事務重新讀取滿足相同條件的行,并在第二次讀取時獲得額外的“虛”行。
|
3、Hibernate中實例的狀態

3-1:臨時狀態
該實例從未與任何持久化上下文關聯過。它沒有持久化標識(相當于主鍵值),臨時狀態下的對象有如下特征。
1) 不處于Session緩存中,也可以說不被任何一個Session關聯
2) 在數據庫中沒有對應的記錄
在以下情況下,Java對象進入臨時狀態
1) 當通過new語句剛創建一個Java對象,它處于臨時狀態,此時不和數據庫中的任何記錄對應。
2) Session的delete()方法能使一個持久化或臨時脫管對象轉換為臨時對象。對于脫管對象,delete()方法從數據庫中刪除與它對應的記錄,并且把它從Session緩存中刪除。
3-2:持久化狀態
該實例目前與某個持久化上下文有關聯,它擁有持久化標識(相當于主鍵值),并且可能在數據庫匯總有一個對應的行。對于某一個特定的持久化上下文,Hibernate保證標識與Java標識(其值代表對應在內存中的位置)等價。持久化對象有以下特征。
1) 位于一個Session實例的緩存中,也可以說,持久化對象總是被一個Session實例關聯。
2) 持久化對象和數據庫中的相關記錄對應。
3) Session在清理緩存時,會根據持久化對象的屬性變化,來同步更新數據庫。
Session的許多方法都能夠觸發Java對象進入持久化狀態。
4) Session的save()的方法能夠把臨時對象轉變成持久化對象。
5) Session的load()或get()方法返回的對象總是處于持久化狀態。
6) Query類的list()方法返回的list集合中存放的都是持久化對象。
7) Session的update()、saveOrUpdate()和lock()方法使脫管對象轉變為持久化對象。
當一個持久化對象關聯一個臨時對象時,在允許級聯保存的情況下,Session在清理緩存時會把這個臨時對象也轉變成持久化對象。Hibernate保證在同一個Session實例的緩存中,數據庫表中的每條記錄只對應唯一的持久化對象,也就是說在一個Session里load/get同一個OID得到 的是相同的對象。
3-3:脫管狀態
實例曾經與某個持久化上下文發生過關聯,不過那個上下文被關閉了,或者這個實例是被序列化(serialize)到另外的進程。它擁有持久化標識,并且在數據庫中可能存在一個對應的行。對于脫管狀態的實例,Hibernate不保證任何持久化標識和Java標識的關系。
脫管對象具有以下特征。
1) 不再位于Session的緩存中,也可以說,脫管對象不被Session關聯。
2) 脫管對象是有持久化對象轉變過來的,因此在數據庫中可能還存在與它對應的記錄(前提條件是沒有其他程序刪除了這條記錄)。
3) 脫管對象與臨時對象的相同指出在于兩者都不被Session關聯,因此Hibernate不會保證他們屬性變化與數據庫保持同步。脫管對象與臨時對象的區別在于前者是由持久化對象轉變過來的,因此可能在書庫中還存在對應的記錄,而后者在數據庫中是沒有對應的記錄的。
Session的以下方法使持久化對象轉變成脫管對象.
1) 當調用Session的close()方法時,Session 的緩存被清空,緩存中的所有持久化對象都變為脫管對象,如果在應用程序中沒有引用變量引用這些脫管對象,他們就會結束生命周期。
2) Session的evict()方法能夠從緩存中刪除一個持久化對象,使它變為脫管狀態,當Session的緩存中保存了大量的持久化對象時,會消耗許多內存空間,為了提高性能,可以考慮調用evict()方法,從緩存中刪除一些持久化對象。但是多數情況下不推薦使用該方法,而應該通過查詢語言,或者顯示的導航來控制對象圖的深度。
posted on 2010-01-09 19:08
absolute 閱讀(674)
評論(0) 編輯 收藏 所屬分類:
OpenSource