菜鸟学SSH(八)——Hibernate对象的三种状态
前面寫了幾篇關于SSH的博客,但不是Struts就是Spring,Hibernate還從來沒寫過呢。說好是SSH的,怎么可以光寫那兩個,而不寫Hibernate呢對吧。今天就先說說Hibernate對象的三種狀態,Hibernate對象有三種狀態,分別是:臨時態(Transient)、 持久態(Persistent)、游離態(Detached)。
臨時狀態:是指從對象通過new語句創建到被持久化之前的狀態,此時對象不在Session的緩存中。
處在此狀態的對象具備以下特點:
1,不在Session緩存中,不與任何Session實例相關聯。
2,在數據庫中沒有與之對應的記錄。
通常在下列情況下對象會進入臨時狀態:
1,通過new語句創建新對象。
2,執行delete()方法,對于游離狀態的對象,delete()方法會將其與數據庫中對應的記錄刪除;而對于持久化狀態的對象,delete()方法會將其與數據庫中對應的記錄刪除,并將其在Session緩存中刪除。
例如:Object object = new Object();
此時object為臨時狀態,數據庫中沒有對應的數據,Session緩存中也沒有相關聯的實例。
持久化狀態:是指對象被持久化到Session對象被銷毀之前的狀態,此時對象在Session的緩存中。
處在此狀態的對象具備以下特點:
1,在Session緩存中,與Session實例相關聯。
2,在數據庫中有與之對應的記錄。
3,Session在清理緩存的時候,會根據持久化對象的屬性變化更新數據庫。
通常在下列情況下對象會進入臨時狀態:
1,執行save()或saveOrUpdate()方法,使臨時對象轉變為持久化對象。
2,執行upda()或saveOrUpdate()方法,使游離對象轉變為持久化對象。
3,執行load()或get()方法,返回的對象都是持久化對象。
4,執行find()方法,返回List集合中存放的都是持久化對象。
5,在允許級聯保存的情況下,Session在清理緩存時會把與持久化對象關聯的臨時對象轉變為持久化對象。
例如:Session session = factory.openSession(); ?object.setName("持久化對象");?session.save(object);
此時object對象為持久化對象,Session緩存中有相關聯的實例,數據庫中有相應的記錄。
游離狀態:是指從持久化對象的Session對象被銷毀到該對象消失之前的狀態,此時對象不在Session的緩存中。
處在此狀態的對象具備以下特點:
1,不在Session緩存中,不與任何Session實例相關聯。
2,在數據庫中有與之對應的記錄(前提是沒有其他Session實例刪除該條記錄)。
通常在下列情況下對象會進入臨時狀態:
1,執行close()方法,將Session緩存清空,緩存中的所有持久化對象將轉變成游離對象。
2,執行evict()方法,能從緩存中刪除一個持久化對象,使之轉變成游離對象。
例如:session.close();?
此時上文的object對象為游離對象,Session緩存中沒有有相關聯的實例,數據庫中有相應的記錄。
三種狀態之間的轉換過程
對上圖的解析:
1,當一個對象被new了以后此對象處于臨時態(Transient)。
2,然后對此對象執行session的save() 或者saveOrUpdate()方法后,此對象被放入session的一級緩存進入持久態。
2,當再對此對象執行evict()/close()/clear()的操作后此對象進入游離態(Detached)。
4,游離態(Detached)和臨時態(Transient)的對象由于沒有被session管理會在適當的時機被java的垃圾回收站(garbage)回收。
5,執行session的get()/load()/find()/iternte()等方法從數據庫里查詢的到的對象,處于持久態(Persistent)。
6,當對數據庫中的紀錄進行update()/saveOrUpdate()/lock()操作后游離態的對象就過渡到持久態。
7,處于持久態(Persistent)與游離態(Detached)的對象在數據庫中都有對應的記錄。
8,臨時態(Transient)與游離態(Detached)的對象都可以被回收可是臨時態的對象在數據庫中沒有對應的紀錄,而游離態的對象在數據庫中有對用的紀錄。
三種狀態在程序的轉換過程:
| 代碼 | 對象的生命周期狀態 | 對象的狀態 |
| Object object = new Object(); | 開始生命周期 | 開始生命周期 |
| Session session = factory.openSession();? | 在生命周期中 | 臨時狀態 |
| session.save(object); | 在生命周期中 | 轉變為持久化狀態 |
| tx.commit(); | 在生命周期中 | 持久化狀態 |
| session.close();? | 在生命周期中 | 轉變為游離狀態 |
| System.out.println(object.getName());? | 在生命周期中 | 游離狀態 |
| object = null; | 結束生命周期 | 結束生命周期 |
?
三種狀態里面,只有持久化狀態在Session緩存中有相關聯的實例,臨時狀態跟游離狀態都沒有。臨時狀態數據庫里沒有對應的記錄,其他兩種可能又記錄,也可能沒有記錄。
好了,Hibernate對象的三種狀態就說到這里,接下來可能跟大家說說Hibernate的Session,期待不?
總結
以上是生活随笔為你收集整理的菜鸟学SSH(八)——Hibernate对象的三种状态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: yii 2.0 代码阅读 小记
- 下一篇: 马来西亚用什么货币 马来西亚是什么币种