瞬時狀態
瞬時狀態又稱臨時狀態.如果java對象與數據庫中的數據沒有任何的關聯,即此java對象在數據庫中沒有相關聯的記錄,此時java對象的狀態為瞬時狀態,session對於
瞬時狀態的ava對象是一無所知的,當對象不再被其他對象引用時,它的所有數據也就丟失了,對象將會被java虛擬機按照垃圾回收處理
持久狀態
當對象與session關聯,被session管理時,它就處於持久狀態.處於直接狀態的對象擁有數據庫標識符(數據庫中主鍵的值).那么,對象是什么時候與session發生關聯呢?
- 通過session查詢接口,或者get()方法,或者load()方法從數據庫中加載對象的時候,加載的對象是與數據庫表中的一條記錄關聯的,此時對象與加載它的session發生關聯,
- 對瞬時狀態的對象調用session的save(),saveOrUpdate()等方法時,在保存對象數據的同事,java對象的內部狀態發生了任何變更,hibernate會選擇合適的時間(如事務提交時)將變成同步到數據庫中
游離狀態
游離狀態又稱托管狀態,處於持久狀態的對象,脫離與其關聯的session的管理后,對象就處於游離狀態.處於游離狀態的對象,hibernate無法保證對象所包含的數與數據
庫中的記錄一致,因為hibernate以及無法感知對該對象的任何操作.session提供了update(),saveOrupdate()等方法,將處於游離狀態的對象數以更新的方式同步到數據庫中
,並將該對象與當前的session關聯.這時,對的狀態就從游離狀態重新轉換為持久狀態
三種狀態之間的轉換
-
瞬時轉持久
- 使用session的save(),saveOrUpdate()等方法保存對象后,該對象的狀態由誰是狀態轉換為持久狀態
- 使用session的get()或load()方法獲取對象,該對象的狀態是持久狀態
-
持久轉瞬時
- 執行session的delete()方法后,對象由原來的持久狀態變為瞬時,因為此時該對象沒有與任何數據庫關聯
-
持久轉游離
- 執行session的evict(),clear()或close()方法,對象由原來的持久狀態轉為游離
-
游離轉持久
- 執行session的update()或saveOrUpdate()方法,對象由游離轉為持久,該對象再次與當前session相關聯
-
游離轉瞬時
1.執行session的delete方法,對象由游離轉為瞬時
注意:處於瞬時或游離的對象不再被其他對象引用時,會被JVM按照垃圾回收機制處理
臟檢查
在hibernate中,數據前后發生變化的對象,稱為臟對象.
tx= HibernateUtil.currentSession().beginTransaction(); //獲取員工對象,此時對象處於持久狀態 Emp empUpdate = empDao.update(7900); //修改后,信息和之前不同,此時 empUpdate對象成為"臟對象" empUpdate.setSal(6666); //提交事務 tx.commit();
以上代碼中empUpdate對象處於持久狀態,當對象被加入session緩存中時,session會為對象復制一份快照,如果快照的屬性發生改變即成為臟對象.
在事務提交時,hibernate會對session中持久化的對象進行檢查,即比較對象當前屬性與它的快照,以判斷屬性是否發生變化,這種判斷成為臟檢查.如
發生改變session會使用最新的屬性值來執行相關的SQL語句,將變化保存確保數據庫和對象數據的數據一致
刷新緩存機制
當session緩存中對象的屬性發生變化時,session並不會立即執行臟檢查和相關的SQL語句,而是在特定的時間,即刷新緩存時才執行.使得session
能夠把多次變化合並為一條或者一批SQL語句,減少訪問次數提高程序的數據訪問性能.
在默認情況下,session會在以下時間點刷新緩存
- 應用程序顯示調用session的flush()方法
- session的flush()方法進行刷新緩存的操作,會觸發臟檢查,從而執行相關的SQL語句
- 應用程序調用事務的 commit()方法時
- commit()方法會先調用session的刷新緩存的方法flush(),然后向數據庫提交事務