小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

hibernate中的對象

 moonboat 2009-01-30
注意:討論的前提是主鍵最好是不含有任何業(yè)務(wù)邏輯含義的。
Hibernate里再三推薦使用這種主鍵,因為主鍵的選擇滿足以下幾點:
1,不能為null
2,每行中只有唯一的值
3,特定行中的相應(yīng)值不能改變
既然誰也無法保證業(yè)務(wù)相關(guān)的屬性不會改變,那么選擇一個純粹意義上的功能單一的(唯一的功能就是做主鍵唯一標識DB中的一行)主鍵省了很多麻煩。
 
hibernate中的對象有三種狀態(tài):transient,persisitent,detached
一,transient object
Hibernate中,用new創(chuàng)建的對象不會馬上持久,此時的狀態(tài)為transient,意味著,這些對象還沒有跟數(shù)據(jù)庫表中的某一行相關(guān)聯(lián),一旦它們不再被程序中的其他對象引用,它們的壽命到此為止,要被gc回收了。在hibernate中,transient對象都是非事務(wù)性的,它們狀態(tài)的改變不會影響任何事務(wù)的上下文環(huán)境,由此可知,hibernate不提供transient對象的回滾。實際上,hibernate不回滾任何對象的變化。transient對象只能被transient對象引用。
 
二,persisitent object
有一個主鍵集作為其在數(shù)據(jù)庫中的identifier(標識)的對象就是persisitent對象。產(chǎn)生persisitent對象有兩種方法:
1,對一個transient對象(即由應(yīng)用程序創(chuàng)建的對象)調(diào)用持續(xù)管理器(Persistence Manager)的API的Session的save()方法
2,由一個已經(jīng)存在的persistent對象創(chuàng)建的對象實例就是persisitent對象
persisitent對象總是跟Seesion相關(guān)聯(lián)的,并且是事務(wù)性的,它參與到事務(wù)中去,在事務(wù)結(jié)束時,它們的狀態(tài)和數(shù)據(jù)庫相同步。
當(dāng)一個persisitent對象分配到了一個主鍵值,但沒有插入到數(shù)據(jù)庫中去,稱之為new persisitent instance,在與數(shù)據(jù)庫同步之前,它一直是new persisitent instance。
 
Automatic dirty checking:自動檢查事務(wù)中的persisitent對象是否被應(yīng)用程序修改過。如果一個對象被修改過,但是這個修改并沒有提交到數(shù)據(jù)庫,此時就認為這個對象是dirty。
 
從DB中remove一個persisitent對象所對應(yīng)的行,則該對象就變成transient對象了。
 
三,detached object
當(dāng)事務(wù)完成后,與Session相關(guān)聯(lián)的persisitent對象仍然存在,仍是persisitent的,直到調(diào)用Session 的close()方法關(guān)閉會話。會話關(guān)閉后,對象稱為detached,表明它們的狀態(tài)不再保證與數(shù)據(jù)庫同步,不在Persistence Manager的管理之下了。但此時,detached的對象仍然包含persisitent數(shù)據(jù),應(yīng)用程序也可能可以獲取這個對象的實例。 Hibernate允許用一個新的Session與之相關(guān)聯(lián),在一個新的事務(wù)中重用這個對象。
 
Hibernate辨別一個對象是transient對象還是detached對象的方法:
1,如果存在identifier屬性的話,判斷是否為null,如果為null則為trasient對象
2,如果存在version屬性的話,判斷是否為null,如果為null則為trasient對象
3,在映射文件中為class或version提供一個"unsaved-value"的屬性,當(dāng)對象中相應(yīng)的屬性(類的是identifier屬性,version就是version屬性)的值等于文件中定義的"unsaved-value"的值,那么該對象就是transient對象。
4,在代碼中使用Interceptor.isUnsaved()方法,如果返回為Boolean.TRUE的話,則為trasient對象
 
其中還談到對象的辨別,即如何辨別persisitent對象對應(yīng)于DB中的同一行,這就涉及到persisitent類的equals()方法和hashcode()方法的實現(xiàn)問題,方法有多種,大多都有或多或少的隱患,有一種比較合適,就是使用business key equality(業(yè)務(wù)鍵相等),一個business key是一個或幾個屬性的聯(lián)合,唯一標識每一個對象,并且對應(yīng)于DB中相同的identifier。每個實體都應(yīng)該有business key,用以唯一標識一條特殊的記錄。
 
關(guān)于Session,創(chuàng)建一個Session的開銷很小,因為它不獲取JDBC連接,不執(zhí)行任何SQL語句,直到需要的時候才獲取,需要與DB 同步時,調(diào)用事務(wù)的commit()方法,此時Hibernate獲得了JDBC的一個連接,并執(zhí)行SQL語句,當(dāng)Session關(guān)閉時,JDBC連接也被釋放了。從session.beginTransaction()到commit()方法之間發(fā)生的一系列操作,都認為是在同一個事務(wù)中的操作。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多