第11章 Hibernate高級特性_第1頁
第11章 Hibernate高級特性_第2頁
第11章 Hibernate高級特性_第3頁
第11章 Hibernate高級特性_第4頁
第11章 Hibernate高級特性_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、11.1 Hibernate事務(wù)管理事務(wù)管理11.2 Hibernate并發(fā)處理并發(fā)處理11.3 Hibernate的攔截器的攔截器11.1.1 事務(wù)的概念事務(wù)的概念事務(wù)有4個重要特性。 原子性:即作為一個事務(wù),它是一個不可分割的整體,只有全部操作都完成了,才算結(jié)束;其中任何一個操作執(zhí)行失敗,整個事務(wù)都要撤銷。 一致性:即事務(wù)不能破壞數(shù)據(jù)庫的完整性和業(yè)務(wù)邏輯的一致性。事務(wù)不管成功還是失敗,事務(wù)結(jié)束時,整個數(shù)據(jù)庫內(nèi)部數(shù)據(jù)都是正確的。 隔離性:即在并發(fā)數(shù)據(jù)庫操作中,不同事務(wù)操作相同的數(shù)據(jù)時,每個事務(wù)都有自己完整的數(shù)據(jù)空間。一個事務(wù)不會看到或拿到另一個事務(wù)正修改到一半的數(shù)據(jù),這些數(shù)據(jù)要么是一個事務(wù)修

2、改前的,要么是另一個事務(wù)修改后提交的。擁有這個特性,是為了保證所有并發(fā)操作的正確性。 持久性:即事務(wù)成功提交后,數(shù)據(jù)就被永久地保存到數(shù)據(jù)庫,重新啟動數(shù)據(jù)庫系統(tǒng)后,數(shù)據(jù)仍然保存在數(shù)據(jù)庫系統(tǒng)中。1基于基于JDBC的事務(wù)管理的事務(wù)管理將事務(wù)管理委托給JDBC進(jìn)行處理是最簡單的實現(xiàn)方式,Hibernate對于JDBC事務(wù)的封裝也比較簡單。例如下面的代碼:Session session = sessionFactory.openSession();Transaction tx=session.beginTransaction();mit();從JDBC層面而言,上面的代碼實際上對應(yīng)著:Connectio

3、n cn = getConnection;cn.setAutoCommit(false);/ JDBC調(diào)用相關(guān)的SQL語句mit();在sessionFactory.openSession()語句中,Hibernate會初始化數(shù)據(jù)庫連接。與此同時,將其AutoCommit設(shè)為關(guān)閉狀態(tài)(false),即一開始從SessionFactory獲得的session,其自動提交屬性已經(jīng)被關(guān)閉。下面的代碼不會對數(shù)據(jù)庫產(chǎn)生任何效果:session session = sessionFactory.openSession();session.save(user);session.close();這實際上相當(dāng)于

4、JDBC Connection的AutoCommit屬性被設(shè)為false,執(zhí)行了若干JDBC操作之后卻并沒有調(diào)用commit操作。如果要使代碼真正作用到數(shù)據(jù)庫,必須顯式地調(diào)用Transaction指令,例如下面的代碼:Session session = sessionFactory.openSession();Transaction tx = session.beginTransaction();session.save(user);mit();session.close();Hibernate的事務(wù)應(yīng)用一般分為下面幾個步驟。(1)通過SessionFactoy獲得Session對象,例如下面

5、的代碼:Session session = sessionFactory.openSession();(2)通過Session對象開始一個事務(wù),例如下面的代碼:Transaction t = session.beginTransaction();(3)進(jìn)行相關(guān)的數(shù)據(jù)操作。(4)事務(wù)提交,例如下面的代碼:mit();(5)如果事務(wù)處理出現(xiàn)異常,則撤銷事務(wù)(通常稱為事務(wù)回滾),例如下面的代碼:t.rollback();(6)關(guān)閉Session,結(jié)束操作,例如下面的代碼:session.close();綜上,一個完整的應(yīng)用Hibernate事務(wù)的實例如下:.Configuration cfg = n

6、ew Configuration().configure();SessionFactory sessionFactory = cfg.buildSessionFactory();Session session = sessionFactory.openSession();Transaction t = session.beginTransaction();tryUserTable user = new UserTable();user.setUsername(Jack);user.setPassword(123456);session.save(user);mit();catch(Except

7、ion e)if(t!=null)t.rollback();e.printStackTrace();finallysession.close();.2基于基于JTA的事務(wù)管理的事務(wù)管理JTA(Java Transaction API)是由Java EE Transaction Manager管理的事務(wù),其最大的特點是調(diào)用UserTransaction接口的begin()、commit()和rollback()方法來完成事務(wù)范圍的界定、事務(wù)的提交和回滾。JTA可以實現(xiàn)同一事務(wù)對應(yīng)不同的數(shù)據(jù)庫。JTA主要用于分布式多個數(shù)據(jù)源的兩階段提交的事務(wù),而JDBC的Connection提供單個數(shù)據(jù)源的事務(wù),

8、后者因為只涉及一個數(shù)據(jù)源,所以其事務(wù)可以由數(shù)據(jù)庫自己單獨實現(xiàn),而JTA事務(wù)因為其分布式和多數(shù)據(jù)源的特性,不可能由任何一個數(shù)據(jù)源實現(xiàn)事務(wù)。JTA提供了跨Session的事務(wù)管理能力,這一點是與JDBC Transaction最大的差異。JTA事務(wù)管理由JTA容器實現(xiàn),JTA容器對當(dāng)前加入事務(wù)的眾多Connection進(jìn)行調(diào)度,實現(xiàn)事務(wù)性要求。JTA的事務(wù)周期可橫跨多個JDBC Connection生命周期。11.2.1 并發(fā)產(chǎn)生的問題并發(fā)產(chǎn)生的問題1. 更新丟失更新丟失當(dāng)多個事務(wù)同時操作同一數(shù)據(jù)時,由于事務(wù)之間完全沒有進(jìn)行隔離,撤銷其中一個事務(wù),結(jié)果覆蓋了其他事務(wù)已經(jīng)提交并成功更新的數(shù)據(jù),對其他

9、事務(wù)而言造成了數(shù)據(jù)丟失。例如,在存款和取款的情況下,如果沒有采取措施,很容易出現(xiàn)如表11.1所示的并發(fā)問題帶來的情況。階 段取 款存 款1事務(wù)開始2查詢賬戶余額1000元3事務(wù)開始4查詢賬戶余額1000元5取走100元,剩余900元6存入100元,賬戶中應(yīng)為1100元7提交事務(wù)8撤銷事務(wù),賬戶余額回滾為事務(wù)開始時的1000元,事務(wù)結(jié)束2臟讀臟讀當(dāng)多個事務(wù)同時操作同一數(shù)據(jù)時,如果事務(wù)A讀到事務(wù)B尚未提交的更新數(shù)據(jù),且對其進(jìn)行操作,當(dāng)事務(wù)B撤銷了更新后,事務(wù)A所操作的數(shù)據(jù)便成了無效數(shù)據(jù)(臟數(shù)據(jù))。同樣以存款取款問題為例,如表11.2所示。階 段取 款存 款1事務(wù)開始2查詢賬戶余額1000元3事務(wù)開

10、始4取走100元,剩余900元5查詢賬戶余額900元6存入100元,賬戶中應(yīng)為1000元7提交事務(wù)8撤銷事務(wù),賬戶余額回滾為事務(wù)開始時的1000元,事務(wù)結(jié)束3虛讀虛讀當(dāng)多個事務(wù)同時操作同一數(shù)據(jù)時,如果事務(wù)A在操作過程中進(jìn)行兩次查詢,很有可能第二次查詢的結(jié)果包含了第一次查詢中未出現(xiàn)的數(shù)據(jù)(這里并不要求兩次查詢的SQL語句相同)。這是因為,在兩次查詢過程中由事務(wù)B插入了新數(shù)據(jù)造成的,如表11.3所示。階 段存 款查 詢1事務(wù)開始2事務(wù)開始3查詢賬戶余額1000元4存入100元,賬戶中應(yīng)為1100元5提交事務(wù)6再次查詢,賬戶余額為1100元7不知到底是1100元還是1000元4不可重復(fù)讀不可重復(fù)讀當(dāng)

11、多個事務(wù)同時操作同一數(shù)據(jù)時,如果事務(wù)A對同一行數(shù)據(jù)重復(fù)讀取兩次,卻得到了不同的結(jié)果,有可能在事務(wù)A兩次讀取的過程中,由事務(wù)B對該行數(shù)據(jù)進(jìn)行了修改,并成功提交,如表11.4所示。階 段取 款存 款1事務(wù)開始2查詢賬戶余額1000元3事務(wù)開始4查詢賬戶余額1000元5存入100元,余額應(yīng)為1100元6存入100元,賬戶中應(yīng)為1100元7提交事務(wù),賬戶余額為1100元8提交事務(wù),賬戶余額為1100元1隔離級別隔離級別標(biāo)準(zhǔn)SQL規(guī)范中提供了4種事務(wù)隔離級別,可以通過Hibernate的配置文件來設(shè)置。 串行化(Serializable):提供嚴(yán)格的事務(wù)隔離。它要求各事務(wù)串行化執(zhí)行,事務(wù)只能一個接著一個

12、地串行執(zhí)行,不能并發(fā)執(zhí)行。 可重復(fù)讀取(Repeatable Read):當(dāng)數(shù)據(jù)庫采用此隔離級別時,一個事務(wù)在執(zhí)行過程中可以訪問其他事務(wù)成功提交的新插入的數(shù)據(jù),但不能訪問成功修改的數(shù)據(jù),因而有效地防止了不可重復(fù)讀取和臟讀兩類并發(fā)問題的發(fā)生。 讀已提交數(shù)據(jù)(Read Committed):當(dāng)數(shù)據(jù)庫采用此隔離級別時,一個事務(wù)在執(zhí)行過程中既可以訪問其他事務(wù)成功提交的新插入的數(shù)據(jù),又可以訪問成功修改的數(shù)據(jù),因而有效地防止了臟讀。 讀未提交數(shù)據(jù)(Read Uncommitted):當(dāng)數(shù)據(jù)庫采用此隔離級別時,一個事務(wù)在執(zhí)行過程中既可以訪問其他事務(wù)未提交的新插入的數(shù)據(jù),又可以訪問未提交的修改數(shù)據(jù),因而僅僅防

13、止了更新丟失的發(fā)生。2鎖鎖業(yè)務(wù)邏輯的實現(xiàn)過程中,往往需要保證數(shù)據(jù)訪問的排他性,如在金融系統(tǒng)的日終結(jié)算處理中,希望對某個結(jié)算時間點的數(shù)據(jù)進(jìn)行處理,而不希望在結(jié)算過程中(可能是幾秒,也可能是幾個小時)數(shù)據(jù)再發(fā)生變化。此時,需要通過一些機(jī)制來保證這些數(shù)據(jù)在某個操作過程中不會被外界修改,這樣的機(jī)制就是所謂的“鎖”,即給選定的目標(biāo)數(shù)據(jù)上鎖,使其無法被其他程序修改。Hibernate支持兩種鎖機(jī)制:悲觀鎖(Pessimistic Locking)和樂觀鎖(Optimistic Locking)。悲觀鎖是指對數(shù)據(jù)被外界修改持保守態(tài)度。假定任何時刻存取數(shù)據(jù)時,都可能有一個客戶也正在存取同一數(shù)據(jù),為了保持?jǐn)?shù)據(jù)被

14、操作的一致性,于是對數(shù)據(jù)采取了數(shù)據(jù)庫層次的鎖定狀態(tài),依靠數(shù)據(jù)庫提供的鎖機(jī)制來實現(xiàn)。11.3.1 Interceptor接口接口Interceptor接口中定義了各種事件對應(yīng)的方法,不同的方法在對應(yīng)的事件發(fā)生時將會被Hibernate自動調(diào)用。下面分別介紹這些方法的含義及執(zhí)行階段。 afterTransactionBegin(Transaction tx):當(dāng)Hibernate事務(wù)被調(diào)用后,該方法將被調(diào)用。 afterTransactionCompletion(Transaction tx):當(dāng)事務(wù)被提交或回滾后,該方法被調(diào)用。 beforeTransactionCompletion(Trans

15、action tx):該方法在一個事務(wù)提交前被調(diào)用,但是回滾前不被調(diào)用。 findDirty(Object entity,Serializable id, Object currentState, Object previousState,String propertyNames, Type types):當(dāng)調(diào)用flush()方法刷新緩存時會自動調(diào)用這個方法檢查緩存中是否有臟數(shù)據(jù)(緩存中有與數(shù)據(jù)庫不一致的數(shù)據(jù))。 onDelete(ObjectSerializable id,Object state, String propertyName,Type types):在對象刪除前被調(diào)用。 onF

16、lushDirty(Object entity,Serializable id, Object currentState, Object previousState, String propertyNames, Type types):如果一個對象在flush執(zhí)行時被發(fā)現(xiàn)是臟數(shù)據(jù),則這個方法會被調(diào)用。 onLoad(Object entity,Serializable id,Object state,String propertyNames,Typtypes):當(dāng)一個對象從數(shù)據(jù)庫中載入時被調(diào)用。 onSave(Object entity,Serializable id,Object state

17、,String propertyNames,Typetypes):在一個方法保存之前被調(diào)用。 onCollectionRecreate(Object collection, Serializable key):在集合被創(chuàng)建或再次創(chuàng)建時被調(diào)用。 onCollectionRemove(Object collection, Serializable key):在集合被刪除時被調(diào)用。 onCollectionUpdate(Object collection, Serializable key):在集合被更新時被調(diào)用。 isTransient(Objectentity):調(diào)用這個方法可以判斷一個實體是持

18、久態(tài)還是脫管態(tài)。 getEntity(String entityName, Serializable id):以對象名字和id為參數(shù),可以返回持久化對象實體。 getEntityName(Objectobject):以持久態(tài)和脫管態(tài)的實體類對象為參數(shù),可以返回實體的名字。 instantiate(String entityName, EntityMode entityMode, Serializable id):這個方法可以顯式地讓Hibernate實例化一個實體類。 onPrepareStatement(String arg0):這個方法可以返回要執(zhí)行的SQL語句,參數(shù)arg0即是要執(zhí)行的SQL語句。 postFlush(Iterator arg0):該方法在持久化所做修改同步完成后會執(zhí)行。 preFlush(Iterator arg0):該方法在同步持久化所做修改之前會執(zhí)行?!緦嵗龑嵗?1.1】Hibernate攔截器應(yīng)用示例。1創(chuàng)建創(chuàng)建Hibernate程序程序創(chuàng)建Java項目,命名為Hibernate_Interceptor。添

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論