Hibernate中的實(shí)體物件可以分為三種狀態(tài):Transient、Persistent、Detached。
Transient與Detached狀態(tài)的物件是非管理狀態(tài),而Persistent狀態(tài)的物件是管理狀態(tài),又稱為Persistent Object。
在物件為Persistent時(shí),如果物件的屬性發(fā)生變化,並且尚未提交之前,物件所攜帶的資料稱之為Dirty Data,Hibernate會(huì)在持久層維護(hù)物件的最近讀取版本,並在資料提交時(shí)檢查兩個(gè)版本的屬性是否有變化,如果有的話,則將資料庫(kù)中的資料進(jìn)行更新。
- Transient
當(dāng)您直接使用new創(chuàng)建出物件,例如在之前的例子中,User類別所衍生出之物件,在還沒(méi)有使用save()之前都是暫存物件,這些物件還沒(méi)有與資料庫(kù)發(fā)生任何的關(guān)係,不對(duì)應(yīng)於資料庫(kù)中的任一筆資料。
- Persistent
當(dāng)物件與資料庫(kù)中的資料有對(duì)應(yīng)關(guān)係,並且與Session實(shí)例有關(guān)聯(lián)而Session 實(shí)例尚未關(guān)閉(close),則它是在Persistent狀態(tài),具體而言,如果您將Transient狀態(tài)的物件使用Session的save()方法加以儲(chǔ)存,或是使用Hibernate從資料庫(kù)載入資料並封裝為物件(例如使用get()、load()),則該物件為Persistent狀態(tài)。
Persistent狀態(tài)的物件對(duì)應(yīng)於資料庫(kù)中的一筆資料,物件的id值與資料的主鍵值相同,並且Session實(shí)例尚未失效,在這期間您對(duì)物件的任何狀態(tài)變動(dòng),在Session實(shí)例關(guān)閉(close)或Transaction實(shí)例執(zhí)行commit()之後,資料庫(kù)中對(duì)應(yīng)的資料也會(huì)跟著更新。
如果您將Session實(shí)例關(guān)閉(close),則Persistent狀態(tài)的物件會(huì)成為Detached狀態(tài)。
如果您使用Session的實(shí)例delete()方法刪除資料,Persistent狀態(tài)的物件由於失去了對(duì)應(yīng)的資料,則它會(huì)成為Transient狀態(tài)。
Persistent狀態(tài)的物件對(duì)應(yīng)於資料庫(kù)中的一筆資料,物件的id值與資料的主鍵值相同,並且Session實(shí)例尚未失效,在這期間您對(duì)物件的任何狀態(tài)變動(dòng),在Session實(shí)例關(guān)閉(close)或Transaction實(shí)例執(zhí)行commit()之後,資料庫(kù)中對(duì)應(yīng)的資料也會(huì)跟著更新。
如果您將Session實(shí)例關(guān)閉(close),則Persistent狀態(tài)的物件會(huì)成為Detached狀態(tài)。
如果您使用Session的實(shí)例delete()方法刪除資料,Persistent狀態(tài)的物件由於失去了對(duì)應(yīng)的資料,則它會(huì)成為Transient狀態(tài)。
- Detached
Detached狀態(tài)的物件,其id與資料庫(kù)的主鍵值對(duì)應(yīng),但脫離Session實(shí)例的管理,例如在使用load()方法查詢到資料並封裝為物件之後,將Session實(shí)例關(guān)閉,則物件由Persistent狀態(tài)變?yōu)镈etached狀態(tài),Detached狀態(tài)的物件之任何屬性變動(dòng),不會(huì)對(duì)資料庫(kù)中的資料造成任何的影響。
Detached狀態(tài)的物件可以使用update()方法使之與資料庫(kù)中的對(duì)應(yīng)資料再度發(fā)生關(guān)聯(lián),此時(shí)Detached狀態(tài)的物件會(huì)變?yōu)镻ersistent狀態(tài)。
簡(jiǎn)單的說(shuō),Transient與Detached狀態(tài)的物件未受Hibernate持久層管理員管理,對(duì)這兩個(gè)狀態(tài)的物件作任何屬性變動(dòng),不會(huì)對(duì)資料庫(kù)中的資料有任何的影響,而Persistent狀態(tài)的物件受Hibernate持久層管理,對(duì)物件的屬性變動(dòng),在Session實(shí)例關(guān)閉(close)或 Transaction實(shí)例執(zhí)行commit()之後,資料庫(kù)中對(duì)應(yīng)的資料也會(huì)跟著更新。Detached狀態(tài)的物件可以使用update()方法使之與資料庫(kù)中的對(duì)應(yīng)資料再度發(fā)生關(guān)聯(lián),此時(shí)Detached狀態(tài)的物件會(huì)變?yōu)镻ersistent狀態(tài)。
Transient與Detached狀態(tài)的物件是非管理狀態(tài),而Persistent狀態(tài)的物件是管理狀態(tài),又稱為Persistent Object。
在物件為Persistent時(shí),如果物件的屬性發(fā)生變化,並且尚未提交之前,物件所攜帶的資料稱之為Dirty Data,Hibernate會(huì)在持久層維護(hù)物件的最近讀取版本,並在資料提交時(shí)檢查兩個(gè)版本的屬性是否有變化,如果有的話,則將資料庫(kù)中的資料進(jìn)行更新。