Follow Me:深入淺出學(xué)習(xí)Hibernate三:Session三種狀態(tài)詳解
Posted on 2012-06-17 19:20 zljpp 閱讀(1020) 評論(0) 編輯 收藏聲明
Session是一個持久化管理器,對數(shù)據(jù)庫進行操作之前,必須先取得Session實例,相當(dāng)于JDBC在對資料庫操作之前,必須取得Connection實例,Session是Hibernate操作的基礎(chǔ),它不是線程安全的,但是我們可以用ThreadLocal(用于存儲每一個線程的變量副本,Map中元素的鍵為線程對象,而值對應(yīng)線程的變量副本,這樣使每一個線程都可以獨立地改變自己的副本,而不會和其它線程的副本沖突。)來保證線程的安全性。
狀態(tài)描述
1. 瞬時對象(Transient Object):
使用new操作符初始化的對象不能立刻就持久的。它們的狀態(tài)時瞬時的,也就是說它們沒有任何跟數(shù)據(jù)庫相關(guān)聯(lián)的行為,在數(shù)據(jù)庫中沒有與之匹配的記錄,還沒有讓session管理。
總結(jié):
1. 沒有被session管理
2. 在數(shù)據(jù)庫中沒有與之匹配的記錄
2. 持久化對象(Persistent Object):
持久實例是任何具有數(shù)據(jù)庫標(biāo)識的實例,它有持久化管理器Session統(tǒng)一管理,持久實例是在事務(wù)中進行操作的一一它們的狀態(tài)事務(wù)結(jié)束時同數(shù)據(jù)庫進行同步。當(dāng)事務(wù)提交時,通過執(zhí)行SQL的INSERT、UPDATE和DELETE語句把內(nèi)存中的狀態(tài)同步到數(shù)據(jù)庫中。
總結(jié):
1. 納入session管理
2. 在數(shù)據(jù)庫中有與之匹配的記錄
3. 當(dāng)屬性改變,在清理緩存是(臟數(shù)據(jù)檢查)會自動和數(shù)據(jù)庫同步
3. 離線對象(Detached Object):
Session關(guān)閉之后,持久化對象變成為離線對象。離線表示這個對象不能再與數(shù)據(jù)庫保持同步,它們不能再接受hibernate管理
總結(jié):
1. 沒有被Session管理
2. 在數(shù)據(jù)中存在與之匹配的記錄
圖例注解
文字有時候是蒼白的,如何更好展現(xiàn)自己的思維,需要我們借助圖形的力量,這樣我們的思維更加深刻,請看Session三種狀態(tài)圖,讓你知道狀態(tài)是如何進行轉(zhuǎn)化。
(通過一系列的方法,改變Session狀態(tài))
三種狀態(tài)的區(qū)分:
1. 有沒有ID,(如果沒有則是Transient狀態(tài))
2. ID在數(shù)據(jù)庫中有沒有
3. 在內(nèi)存里有沒有(Session緩存)
總結(jié)
想必大家對Session的狀態(tài)有了一定的了解,那我們就在總結(jié)一下,便于我們理解的區(qū)別。
Transient對象:隨時可能被垃圾回收器回收(在數(shù)據(jù)庫中沒有于之對應(yīng)的記錄,應(yīng)為是new初始化),而執(zhí)行save()方法后,就變?yōu)镻ersistent對象(持久性對象),沒有納入session的管理。( 內(nèi)存中一個對象,沒有ID,緩存中也沒有)
Persistent對象:在數(shù)據(jù)庫有存在的對應(yīng)的記錄,納入session管理。在清理緩存(臟數(shù)據(jù)檢查)的時候,會和數(shù)據(jù)庫同步。( 內(nèi)存中有、緩存中有、數(shù)據(jù)庫有(ID)Detached對象:也可能被垃圾回收器回收掉(數(shù)據(jù)庫中存在對應(yīng)的記錄,只是沒有任何對象引用它是指session引用),注引狀態(tài)經(jīng)過Persistent狀態(tài),沒有納入session的管理。(內(nèi)存有、緩存沒有、數(shù)據(jù)庫有(ID)