隨筆-16  評論-84  文章-1  trackbacks-0

           

          Hibernate學習筆記

          1、Hibernate核心類與接口    

          1-1.Configuration

                Configuration類是Hibernate的入口,它負責配置和啟動Hibernate,Hibernate框架通過Configuration實例加載配置文件信息(hibernate.cfg.xml),然后讀取指定對象關(guān)系映射文件(bean.hbm.xml)的內(nèi)容并創(chuàng)建SessionFactory.

          1-2.SessionFactory接口

                 SessionFactory接口負責初始化Hibernate,一個SessionFactory實例對應一個數(shù)據(jù)存儲源(一般就是指一個數(shù)據(jù)庫)。應用程序從SessionFactory中獲得Session實例。SessionFactory具有以下特點:

                 1)    線程安全,即同一個 SessionFactory實例可以被應用 的多個線程共享。

                 2)    它是重量級的 ,因為它需要一個很大的緩存,用來存放預定義的SQL語句以及映射元數(shù)據(jù)等。

          所以說 ,如果一個應用程序中只訪問一個數(shù)據(jù)庫 ,則只需要創(chuàng)建一個全局的 SessionFactory實例。

          1-3.Session 接口

              SessionHibernate中應用最頻繁的接口。Session也被稱為持久化管理器 ,它負責管理所有與持久化相關(guān)的操作:如存儲、更新、刪除和加載對象等。Session接口具有以下特點:

              1)    單線程,非共享的對象。線程不安全,在設計軟件架構(gòu)時候,應該避免多個線程共享同一個session實例。

              2)    Session 實例是輕量級的,它的創(chuàng)建和銷毀不需要消耗太多的資源。可以為每個請分配一個Session實例,在每次請求過程匯總及時創(chuàng)建和銷毀 Session實例。

              3)    Session有一個緩存,它存放當前工作單元加載的對象。Session的緩存被稱為Hibernate的一級緩存。

          1-4.Transaction接口

              Transaction接口是 Hibernate框架的事務接口。它對底層的事務接口做了封裝,包括:JDBC APIJTA.這樣使得Hibernate應用可以通過一致的Transaction接口來申明事務邊界,這有助于應用程序再不同的環(huán)境和容器中移植。

          1-5.QueryCriteria接口

              它們是 Hibernate的查詢接口,用于從數(shù)據(jù)存儲源查詢對象及控制執(zhí)行查詢的過程。Query包裝了一個 HQL(Hibernate Query Language);而Criteria接口完全封裝了基本字符串形式的查詢語句,比Query更加面向?qū)ο螅?/span>Criteria接口擅長于執(zhí)行動態(tài)查詢。

          2、Hibernate中常用的事務隔離級別

          常量

          說明

          TRANSACTION_NONE 

          0

          不支持事務

          TRANSACTION_READ_UNCOMMITTED

          1

          指示可以發(fā)生臟讀(dirty read)、不可重復讀和虛讀(phantom read)的常量。此級別允許被某一事務更改的行在已提交該行所有更改之前被另一個事務讀取(“臟讀”)。如果所有更改都被回滾,則第二個事務將獲取無效的行。

          TRANSACTION_READ_COMMITTED

          2

          指示不可以發(fā)生臟讀的常量;不可重復讀和虛讀可以發(fā)生。此級別只禁止事務讀取其中帶有未提交更改的行。

          TRANSACTION_REPEATABLE_READ

          4

          指示不可以發(fā)生臟讀和不可重復讀的常量;虛讀可以發(fā)生。此級別禁止事務讀取帶有未提交更改的行,它還禁止這種情況:一個事務讀取某一行,而另一個事務更改該行,第一個事務重新讀取該行,并在第二次讀取時獲得不同的值(“不可重復讀”)。

          TRANSACTION_SERIALIZABLE

          8

          指示不可以發(fā)生臟讀、不可重復讀和虛讀的常量。此級別包括TRANSACTION_REPEATABLE_READ 中禁止的事項,同時還禁止出現(xiàn)這種情況:某一事務讀取所有滿足 WHERE 條件的行,另一個事務插入一個滿足 WHERE 條件的行,第一個事務重新讀取滿足相同條件的行,并在第二次讀取時獲得額外的“虛”行。

          3、Hibernate中實例的狀態(tài)

          3-1:臨時狀態(tài)

                 該實例從未與任何持久化上下文關(guān)聯(lián)過。它沒有持久化標識(相當于主鍵值),臨時狀態(tài)下的對象有如下特征。

          1)    不處于Session緩存中,也可以說不被任何一個Session關(guān)聯(lián)

          2)    在數(shù)據(jù)庫中沒有對應的記錄

          在以下情況下,Java對象進入臨時狀態(tài)

          1) 當通過new語句剛創(chuàng)建一個Java對象,它處于臨時狀態(tài),此時不和數(shù)據(jù)庫中的任何記錄對應。

          2) Sessiondelete()方法能使一個持久化或臨時脫管對象轉(zhuǎn)換為臨時對象。對于脫管對象,delete()方法從數(shù)據(jù)庫中刪除與它對應的記錄,并且把它從Session緩存中刪除。

          3-2:持久化狀態(tài)

                該實例目前與某個持久化上下文有關(guān)聯(lián),它擁有持久化標識(相當于主鍵值),并且可能在數(shù)據(jù)庫匯總有一個對應的行。對于某一個特定的持久化上下文,Hibernate保證標識與Java標識(其值代表對應在內(nèi)存中的位置)等價。持久化對象有以下特征。

          1) 位于一個Session實例的緩存中,也可以說,持久化對象總是被一個Session實例關(guān)聯(lián)。

          2) 持久化對象和數(shù)據(jù)庫中的相關(guān)記錄對應。

          3) Session在清理緩存時,會根據(jù)持久化對象的屬性變化,來同步更新數(shù)據(jù)庫。

          Session的許多方法都能夠觸發(fā)Java對象進入持久化狀態(tài)。

          4) Sessionsave()的方法能夠把臨時對象轉(zhuǎn)變成持久化對象。

          5) Sessionload()get()方法返回的對象總是處于持久化狀態(tài)。

          6) Query類的list()方法返回的list集合中存放的都是持久化對象。

          7) Sessionupdate()saveOrUpdate()lock()方法使脫管對象轉(zhuǎn)變?yōu)槌志没瘜ο蟆?/span>

          當一個持久化對象關(guān)聯(lián)一個臨時對象時,在允許級聯(lián)保存的情況下,Session在清理緩存時會把這個臨時對象也轉(zhuǎn)變成持久化對象。Hibernate保證在同一個Session實例的緩存中,數(shù)據(jù)庫表中的每條記錄只對應唯一的持久化對象,也就是說在一個Sessionload/get同一個OID得到 的是相同的對象。

          3-3:脫管狀態(tài)

                      實例曾經(jīng)與某個持久化上下文發(fā)生過關(guān)聯(lián),不過那個上下文被關(guān)閉了,或者這個實例是被序列化(serialize)到另外的進程。它擁有持久化標識,并且在數(shù)據(jù)庫中可能存在一個對應的行。對于脫管狀態(tài)的實例,Hibernate不保證任何持久化標識和Java標識的關(guān)系。

          脫管對象具有以下特征。

          1)    不再位于Session的緩存中,也可以說,脫管對象不被Session關(guān)聯(lián)。

          2)    脫管對象是有持久化對象轉(zhuǎn)變過來的,因此在數(shù)據(jù)庫中可能還存在與它對應的記錄(前提條件是沒有其他程序刪除了這條記錄)

          3)    脫管對象與臨時對象的相同指出在于兩者都不被Session關(guān)聯(lián),因此Hibernate不會保證他們屬性變化與數(shù)據(jù)庫保持同步。脫管對象與臨時對象的區(qū)別在于前者是由持久化對象轉(zhuǎn)變過來的,因此可能在書庫中還存在對應的記錄,而后者在數(shù)據(jù)庫中是沒有對應的記錄的。

          Session的以下方法使持久化對象轉(zhuǎn)變成脫管對象.

          1)      當調(diào)用Sessionclose()方法時,Session 的緩存被清空,緩存中的所有持久化對象都變?yōu)槊摴軐ο螅绻趹贸绦蛑袥]有引用變量引用這些脫管對象,他們就會結(jié)束生命周期。

          2)      Sessionevict()方法能夠從緩存中刪除一個持久化對象,使它變?yōu)槊摴軤顟B(tài),當Session的緩存中保存了大量的持久化對象時,會消耗許多內(nèi)存空間,為了提高性能,可以考慮調(diào)用evict()方法,從緩存中刪除一些持久化對象。但是多數(shù)情況下不推薦使用該方法,而應該通過查詢語言,或者顯示的導航來控制對象圖的深度。

           

          posted on 2010-01-09 19:08 absolute 閱讀(677) 評論(0)  編輯  收藏 所屬分類: OpenSource

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 海城市| 诸城市| 兴义市| 新竹市| 荣昌县| 呼图壁县| 夏邑县| 汶川县| 嘉义市| 卢龙县| 故城县| 台北市| 武隆县| 武城县| 林口县| 东莞市| 崇明县| 兰州市| 湖北省| 渭源县| 开封市| 尼玛县| 鄂托克前旗| 卓资县| 沾化县| 阿合奇县| 惠安县| 扶沟县| 基隆市| 凌海市| 溆浦县| 茂名市| 瑞丽市| 深泽县| 乌兰察布市| 钦州市| 若尔盖县| 梁平县| 长葛市| 常山县| 奈曼旗|