1. 程式人生 > >Hibernate中持久化物件的三種狀態簡述

Hibernate中持久化物件的三種狀態簡述

持久化物件的三種狀態簡述

在Hibernate中持久化類的物件可以劃分為三種狀態,分別是:
瞬態持久態脫管態

一、瞬時狀態(Transient)

瞬時物件特點:

(1) 不和 Session 例項關聯
(2) 在資料庫中沒有和瞬時物件關聯的記錄

通過Java的new關鍵字來生成一個實體物件時,這時這個實體物件就處於瞬時狀態,如下:

 Customer customer=new Customer(“zx”,27,images);	//瞬時態

為什麼說customer物件處於自由狀態呢?

這是因為,此時customer只是通過JVM獲得了一塊記憶體空間,還並沒有通過Session物件的save()方法儲存進資料庫,因此也就還沒有納入Hibernate的快取管理中,也就是說customer物件現在還自由的遊蕩於Hibernate快取管理之外。所以我們可以看出自由物件最大的特點就是:在資料庫中不存在一條與它對應的記錄

二、持久化狀態(Persistent)

持久化物件的特點:

(1) 持久物件總是與 Session 和 Transaction 相關聯
(2) 在資料庫中有和持久物件關聯的記錄

持久化物件就是已經被儲存進資料庫的實體物件,並且這個實體物件現在還處於Hibernate的快取管理之中。這是對該實體物件的任何修改,都會在清理快取時同步到資料庫中。如下所示:

Customer customer=new Customer(“zx”,27,images);		//瞬時狀態
tx=session.beginTransaction();
session.save(customer)
; //持久化狀態 customer=(Customer)session.load(Customer.class,1); customer.setAge(28); tx.commit();

這時我們並沒有顯示呼叫session.update()方法來儲存更新,但是對實體物件的修改還是會同步更新到資料庫中,因為此時customer物件通過save方法儲存進資料庫後,已經是持久化物件了,然後通過load方法再次載入它,它仍然是持久化物件,所以它還處於Hibernate快取的管理之中,這時當執行tx.commit()方法時,Hibernate會自動清理快取,並且自動將持久化物件的屬性變化同步到到資料庫中。

瞬時物件轉為持久物件:

(1) 通過 Session 的 save() 和 saveOrUpdate()方法把一個瞬時物件與資料庫相關聯,這個瞬時物件就成為持久化物件。

(2) 使用 fine(),get(),load() 和 iterater() 待方法查詢到的資料物件,將成為持久化物件。

在這裡插入圖片描述

三、脫管狀態 (Detached)

脫管物件特點:

(1) 本質上和瞬時物件相同
(2) 只是比愛瞬時物件多了一個數據庫記錄標識值 id.

當一個持久化物件,脫離開Hibernate的快取管理後,它就處於遊離狀態,遊離物件和自由物件的最大區別在於,遊離物件在資料庫中可能還存在一條與它對應的記錄,只是現在這個遊離物件脫離了Hibernate的快取管理,而自由物件不會在資料庫中出現與它對應的資料記錄。如下所示:

Customer customer=new Customer(“zx”,27,images);		//瞬時態
tx=session.beginTransaction();
session.save(customer);								//持久態
customer=(Customer)session.load(Customer.class,1);
customer.setAge(28);
tx.commit();
session.close();									//遊離(脫管)態

當session關閉後,customer物件就不處於Hibernate的快取管理之中了,但是此時在資料庫中還存在一條與customer物件對應的資料記錄,所以此時customer物件處於遊離態
與持久物件關聯的 Session 被關閉後,物件就變為脫管物件。對脫管物件的引用依然有效,物件可繼續被修改。

持久物件轉為脫管物件:

當執行 close() 或 clear(),evict() 之後,持久物件會變為脫管物件。