konhon

忘掉過去,展望未來。找回自我,超越自我。
逃避不一定躲的过, 面对不一定最难过, 孤单不一定不快乐, 得到不一定能长久, 失去不一定不再拥有, 可能因为某个理由而伤心难过, 但我却能找个理由让自己快乐.

Google

BlogJava 首页 新随笔 联系 聚合 管理
  203 Posts :: 0 Stories :: 61 Comments :: 0 Trackbacks
Hibernate中的實體物件可以分為三種狀態:Transient、Persistent、Detached
  • Transient
當您直接使用new創建出物件,例如在之前的例子中,User類別所衍生出之物件,在還沒有使用save()之前都是暫存物件,這些物件還沒有與資料庫發生任何的關係,不對應於資料庫中的任一筆資料。

  • Persistent
當物件與資料庫中的資料有對應關係,並且與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
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會在持久層維護物件的最近讀取版本,並在資料提交時檢查兩個版本的屬性是否有變化,如果有的話,則將資料庫中的資料進行更新。

posted on 2005-08-10 22:11 konhon 优华 阅读(339) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: