臨時狀態(Transient):也叫瞬時狀態。new出來的物件,沒有被持久化處理,不處於Session快取中的物件
持久化狀態(Persistent):已經被持久化,加入到Session的快取中
遊離狀態(Detached):也叫脫管狀態。已經被持久化,但是不處在Session快取中
⑴臨時物件的特徵:
不處於Session快取中(不被任何一個Session例項關聯)
在資料庫中沒有對應的記錄
進入臨時狀態的條件:
new一個Java物件,他處於臨時狀態,不和資料庫任何記錄關聯
Session的delete方法能夠是一個持久化物件或遊離物件轉變為臨時狀態;對於遊離物件,
delete方法從資料庫中刪除與它對應的記錄;對於持久化物件,delete方法從資料庫中刪除與它對應的記錄,
並把它從session快取中刪除
⑵持久化物件的特徵:
在一個Session例項的快取中(與一個Session關聯)
持久化物件和資料庫中的相關記錄對應
Session清理快取時,會根據持久化物件的屬性變化,來同步更新資料庫
進入持久化狀態的條件
session的save方法
session的load和get方法返回的物件都是處於持久化狀態
session的find方法返回的List中存在的物件都是處於持久化狀態
session的update、saveOrUpdate和lock方法使得遊離物件轉換為持久化狀態
當一個持久化物件關聯一個臨時物件,在允許級聯儲存的情況下,Session在清理快取時把這個物件也轉變為持久化狀態
⑶遊離物件的特徵:
不再位於session快取中(遊離物件不被Session關聯)
遊離物件是從持久化物件轉變過來的,因此在資料庫中可能還存在與其對應的記錄
遊離物件與臨時物件的.區別在於:前者是由持久化物件轉變過來的,前者在資料庫中還存在與之對應的記錄,
而後者在資料庫中沒有與之對應的記錄;
進入遊離狀態的條件
當呼叫session的close方法的時候,session快取被清空,快取中的所有持久化物件都變為遊離狀態。如果此時再沒有其它變數引用的時候,其生命週期結束
session的evict方法能夠從快取中刪除一個持久化物件,使它變為遊離狀態。如果記憶體中存在大量的物件的時候,可以通過這個方法來刪除快取中的物件(不建議使用這個方法,還是使用查詢的方法和常規方法來處理物件在記憶體 中的深度)