使用持久對象_第1頁
使用持久對象_第2頁
使用持久對象_第3頁
使用持久對象_第4頁
使用持久對象_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第三章使用持久對象持久對象Hibernate被稱為持久層框架。其主要維護了一個包含有許多session的容器(或者說是“池”)。在這個容器中,維護了很多的持久對象(實體對象)。對實體對象生命周期的理解和把握,不僅對正確使用hibernate十分有益,而且對hibernate的實現(xiàn)原理的探索也極具意義。對象狀態(tài)瞬態(tài):即實體對象在內(nèi)存中自由存在,與數(shù)據(jù)庫中的記錄沒有任何關(guān)系。這里的user對象,和數(shù)據(jù)庫沒有任何關(guān)系public void fun()Tuser user = new Tuser();user.setName(“Tom”);對象狀態(tài)持久態(tài)即實體對象處在Hibernate框架所管理的狀態(tài)

2、。這種狀態(tài)下,實體對象的引用被納入Hibernate實體容器里加以管理。處于持久狀態(tài)的對象,其變更都會由Hibernate固化到數(shù)據(jù)庫。對象狀態(tài)游離態(tài)處于持久狀態(tài)的對象,對應(yīng)的session實例關(guān)閉之后,那么,此對象就處于游離狀態(tài)session實例可以看成是持久對象的宿主,一旦宿主失效,那么其從屬的持久對象即進入游離狀態(tài)。對象狀態(tài)一個對象能從一個暫時對象轉(zhuǎn)變?yōu)橐粋€持久對象在轉(zhuǎn)變?yōu)橐粋€游離對象持久態(tài)示例:Tuser user = new Tuser();user.setName(“Jack”);/此時處于瞬態(tài)Transaction tx = session.beginTransaction();

3、session.save(user);/由save方法,納入容器中,處于持久狀態(tài)mit();/提交之后,由容器固化到數(shù)據(jù)庫,插入記錄Transaction tx2 = session.beginTransaction();user.setName(“Rose”);/此時,user依舊處于持久狀態(tài)mit();/雖然沒有使用save方法,但是由于user處于/持久狀態(tài),tx2提交之后,數(shù)據(jù)庫發(fā)生Update持久態(tài)示例2:/由hibernate返回的持久狀態(tài)Tuser user = (Tuser)session.load(Tuser.class,new Integer(1);/使用session.l

4、oad方法中,在返回對象之前,Hibernate已經(jīng)將其納入/容器中,這里的user處于持久狀態(tài)如果一個實體對象與某個session發(fā)生了關(guān)聯(lián),并處于對應(yīng)session的有效期內(nèi),那么它就是持久狀態(tài)游離態(tài)例子1:Tuser user = new Tuser();user.setName(“Jack”);/此時處于自由狀態(tài) Transaction tx = session.beginTransaction();session.save(user);/由save方法,納入容器中,處于持久狀態(tài)mit();/提交之后,由容器固化到數(shù)據(jù)庫,插入記錄session.close();/此時的user對象處于

5、游離狀態(tài),因為與其/關(guān)聯(lián)的session已經(jīng)關(guān)閉游離態(tài)例子2:Tuser user = new Tuser();user.setName(“Jack”);/此時處于瞬態(tài)Transaction tx = session.beginTransaction();session.save(user);/由save方法,納入容器中,處于持久狀態(tài)mit();/提交之后,由容器固化到數(shù)據(jù)庫,插入記錄session.close();/此時的user對象處于游離狀態(tài),因為與其/關(guān)聯(lián)的session已經(jīng)關(guān)閉Transaction tx2 = session2.beginTransaction();session2

6、.update(user);/此時,處于游離狀態(tài)的user對象借助/session2再次納入hibernate容器內(nèi)user.setName(“Rose”);mit();/user再次處于持久狀態(tài),因為其屬性發(fā)生/變更,將自動由hibernate固化到數(shù)據(jù)庫中游離態(tài)由上例可知,瞬態(tài)對象和游離狀態(tài)對象,最大的區(qū)別是:游離對象可以再次和某個session實例關(guān)聯(lián),而成為持久對象。持久對象-主鍵session.save執(zhí)行后,Hibernate對user對象進行了持久化,并為其賦予了主鍵值。主鍵被我們設(shè)置為自動增長型。并交由Hibernate容器管理。Hibernate就按照實體對象的id來識別,并

7、標識每個實體對象和數(shù)據(jù)庫表中記錄間的聯(lián)系瞬態(tài)和游離態(tài)對象的識別瞬態(tài)的對象,與數(shù)據(jù)庫表中的記錄缺乏對應(yīng)關(guān)系。(由于缺乏主鍵)游離狀態(tài)的對象,在數(shù)據(jù)庫表中存在相對應(yīng)的記錄(由主鍵唯一標識),只不過游離對象脫離了session這個平臺,其狀態(tài)的變更無法更新到數(shù)據(jù)庫中。瞬態(tài)的對象,無主鍵信息。游離狀態(tài)的對象,包含了其對應(yīng)數(shù)據(jù)庫記錄的主鍵值三種狀態(tài)的轉(zhuǎn)換持久態(tài)游離態(tài)持久態(tài)瞬態(tài)實體對象識別既然,識別實體對象的三種狀態(tài)如此重要,Hibernate又是通過比較兩個對象的主鍵屬性來識別每個對象的,那么在實體類里面,如何定義對象的比較方法,就很重要了。VO與PO自由和游離狀態(tài)的對象統(tǒng)稱為VO(值對象)處于持久狀態(tài)

8、的對象稱為PO(持久對象)應(yīng)該避免直接將PO傳遞到系統(tǒng)中的其他層面(MVC)解決方法之一,創(chuàng)建一個新的VO使他具有與被傳遞VO相同的屬性值。(可借助工具)equalspublic boolean equals(Object rhs) if (rhs = null) return false; if (! (rhs instanceof Stu) return false; Stu that = (Stu) rhs; if (this.getStuId() = null | that.getStuId() = null) return false; return (this.getStuId().equals(that.getStuId(); hashCode public int hashCode() if (this.hashValue = 0) int result = 17; int stuIdValue = this.ge

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論