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