99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

SSH Hibernate對象的三種狀態(tài)

2018-09-28 18:58 更新

Hibernate 對象的三種狀態(tài)

前面寫了幾篇關(guān)于SSH的博客,但不是Struts就是Spring,Hibernate還從來沒寫過呢。說好是SSH的,怎么可以光寫那兩個,而不寫Hibernate呢對吧。今天就先說說Hibernate對象的三種狀態(tài),Hibernate對象有三種狀態(tài),分別是:臨時態(tài)(Transient)、 持久態(tài)(Persistent)、游離態(tài)(Detached)。

臨時狀態(tài):是指從對象通過new語句創(chuàng)建到被持久化之前的狀態(tài),此時對象不在Session的緩存中。

處在此狀態(tài)的對象具備以下特點:

  • 1不在Session緩存中,不與任何Session實例相關(guān)聯(lián)。
  • 2在數(shù)據(jù)庫中沒有與之對應的記錄。

通常在下列情況下對象會進入臨時狀態(tài):

  • 1通過new語句創(chuàng)建新對象。
  • 2執(zhí)行delete()方法,對于游離狀態(tài)的對象,delete()方法會將其與數(shù)據(jù)庫中對應的記錄刪除;而對于持久化狀態(tài)的對象,delete()方法會將其與數(shù)據(jù)庫中對應的記錄刪除,并將其在Session緩存中刪除。

例如:Object object = new Object();此時object為臨時狀態(tài),數(shù)據(jù)庫中沒有對應的數(shù)據(jù),Session緩存中也沒有相關(guān)聯(lián)的實例。

持久化狀態(tài):是指對象被持久化到Session對象被銷毀之前的狀態(tài),此時對象在Session的緩存中。

處在此狀態(tài)的對象具備以下特點:

  • 1在Session緩存中,與Session實例相關(guān)聯(lián)。
  • 2在數(shù)據(jù)庫中有與之對應的記錄。
  • 3Session在清理緩存的時候,會根據(jù)持久化對象的屬性變化更新數(shù)據(jù)庫。

通常在下列情況下對象會進入臨時狀態(tài):

  • 1執(zhí)行save()或saveOrUpdate()方法,使臨時對象轉(zhuǎn)變?yōu)槌志没瘜ο蟆?/li>
  • 2執(zhí)行upda()或saveOrUpdate()方法,使游離對象轉(zhuǎn)變?yōu)槌志没瘜ο蟆?/li>
  • 3執(zhí)行l(wèi)oad()或get()方法,返回的對象都是持久化對象。
  • 4執(zhí)行find()方法,返回List集合中存放的都是持久化對象。
  • 5在允許級聯(lián)保存的情況下,Session在清理緩存時會把與持久化對象關(guān)聯(lián)的臨時對象轉(zhuǎn)變?yōu)槌志没瘜ο蟆?/li>

例如:Session session = factory.openSession(); object.setName("持久化對象"); session.save(object);此時object對象為持久化對象,Session緩存中有相關(guān)聯(lián)的實例,數(shù)據(jù)庫中有相應的記錄。

游離狀態(tài):是指從持久化對象的Session對象被銷毀到該對象消失之前的狀態(tài),此時對象不在Session的緩存中。

處在此狀態(tài)的對象具備以下特點:

  • 1不在Session緩存中,不與任何Session實例相關(guān)聯(lián)。
  • 2在數(shù)據(jù)庫中有與之對應的記錄(前提是沒有其他Session實例刪除該條記錄)。

通常在下列情況下對象會進入臨時狀態(tài):

  • 1執(zhí)行close()方法,將Session緩存清空,緩存中的所有持久化對象將轉(zhuǎn)變成游離對象。
  • 2執(zhí)行evict()方法,能從緩存中刪除一個持久化對象,使之轉(zhuǎn)變成游離對象。

例如:session.close();此時上文的object對象為游離對象,Session緩存中沒有有相關(guān)聯(lián)的實例,數(shù)據(jù)庫中有相應的記錄。

三種狀態(tài)之間的轉(zhuǎn)換過程


對上圖的解析:

  • 1當一個對象被new了以后此對象處于臨時態(tài)(Transient)。
  • 2然后對此對象執(zhí)行session的save() 或者saveOrUpdate()方法后,此對象被放入session的一級緩存進入持久態(tài)。
  • 3當再對此對象執(zhí)行evict()/close()/clear()的操作后此對象進入游離態(tài)(Detached)。
  • 4游離態(tài)(Detached)和臨時態(tài)(Transient)的對象由于沒有被session管理會在適當?shù)臅r機被java的垃圾回收站(garbage)回收。
  • 5執(zhí)行session的get()/load()/find()/iternte()等方法從數(shù)據(jù)庫里查詢的到的對象,處于持久態(tài)(Persistent)。
  • 6當對數(shù)據(jù)庫中的紀錄進行update()/saveOrUpdate()/lock()操作后游離態(tài)的對象就過渡到持久態(tài)。
  • 7處于持久態(tài)(Persistent)與游離態(tài)(Detached)的對象在數(shù)據(jù)庫中都有對應的記錄。
  • 8臨時態(tài)(Transient)與游離態(tài)(Detached)的對象都可以被回收可是臨時態(tài)的對象在數(shù)據(jù)庫中沒有對應的紀錄,而游離態(tài)的對象在數(shù)據(jù)庫中有對用的紀錄。

三種狀態(tài)在程序的轉(zhuǎn)換過程:

代碼對象的生命周期狀態(tài)對象的狀態(tài)
Object object = new Object();開始生命周期開始生命周期
Session session = factory.openSession(); Transaction tx = session.beginTransaction();在生命周期中臨時狀態(tài)
session.save(object);在生命周期中轉(zhuǎn)變?yōu)槌志没癄顟B(tài)
tx.commit();在生命周期中持久化狀態(tài)
session.close();在生命周期中轉(zhuǎn)變?yōu)橛坞x狀態(tài)
System.out.println(object.getName());在生命周期中游離狀態(tài)
object = null;結(jié)束生命周期結(jié)束生命周期

三種狀態(tài)里面,只有持久化狀態(tài)在Session緩存中有相關(guān)聯(lián)的實例,臨時狀態(tài)跟游離狀態(tài)都沒有。臨時狀態(tài)數(shù)據(jù)庫里沒有對應的記錄,其他兩種可能又記錄,也可能沒有記錄。好了,Hibernate對象的三種狀態(tài)就說到這里,接下來可能跟大家說說Hibernate的Session,期待不?

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號