目錄:(后續不斷更新...)
- Hibernate 入門 01 - 框架技術 (介紹Hibernate框架的發展由來)
- Hibernate 入門 02 - Hibernate介紹及其環境搭建
- Hibernate 入門 03 - 使用Hibernate完成持久化操作
- Hibernate 入門 04 - Hibernate中java對象的三種狀態
當應用通過調用Hibernate API與框架發生交互時,需要從持久化的角度關注應用對象的生命周期。
持久化聲明周期是Hibernate中的一個關鍵概念,正確地理解生命周期,可以更好地了解Hibernate的實現原理,掌握Hibernate的正確用法。
Hibernate框架通過session來管理Java對象的狀態,在持久化生命周期中,Java對象存在著如下三種狀態:
瞬時狀態(Transient)
通過new創建對象后,對象并沒有like持久化,它并未與數據庫中的數據有任何關聯,此時Java對象的狀態為瞬時狀態。
Session對于瞬時狀態的Java對象是一無所知的,當對象不再被其他對象引用時,它的所有數據也就丟失了,對象將會被Java虛擬機按照垃圾回收機制處理。
持久狀態(Persistent)
當對象與Session關聯,被Session管理時,它就處于持久狀態。處于持久狀態的對象擁有數據庫標識(數據庫中的主鍵值)。
那么,對象是什么時候與Session發生關聯的呢?有兩種方法:
第一種,通過Sesison的查詢接口,或者get()方法,或者load()方法從數據庫中加載對象的時候,加載的對象是與數據庫表中的一條記錄關聯的,此時對象與加載它的Session發生關聯;
第二種,瞬時狀態的對象,通過Session的save()方法或SaveOrUpdate()方法時,Java對象也與Session發生關聯。
對于處于持久狀態的對象,Session會持續跟蹤和管理它們,如果對象的內部狀態發生了任何變更,Hibernate會選擇合適的時機(如事務提交時)將變更固化到數據庫中。
游離狀態
處于持久狀態的對象,脫離與其關聯的nSession的管理后,對象就處于游離狀態。
處于游離狀態的對象,Session無法保證對象所包含的數據與數據庫中的記錄一直,因為Hibernate已經無法感知對該對象的任何操作。
Session提供了兩個方法(update()、merge()),將處于游離狀態的對象,與一個新的Session發生關聯。
此時,對象的狀態就從游離狀態重新轉換為持久狀態。
在Hibernate應用中,不同的持久化操作會導致對象狀態的改變。如圖描述了對象狀態的轉換:
使用new關鍵字構建對象,該對象的狀態是瞬時狀態。
2.1 瞬時狀態轉為持久狀態
使用Session對象的save()或saveOrUpdate()方法保存對象后,該對象的狀態由瞬時狀態轉換為持久狀態。
使用Session對象的get()或load()方法獲取對象,該對象的狀態是持久狀態。
2.2 持久狀態轉為瞬時狀態
執行Session對象的delete()方法后,對象由原來的持久狀態變為瞬時狀態,因為此時該對象沒有與任何的數據庫數據關聯。
2.3 持久狀態轉為游離狀態
吃行了Session對象的evict()、clear()或close()方法,對象由原來的持久狀態轉為游離狀態。
2.4 游離狀態轉為持久狀態
重新獲取Session對象,執行Session對象的update()或saveOrUpdate()方法,對象由游離狀態轉為持久狀態,該對象再次與Session對象相關聯。
2.5 游離狀態轉為瞬時狀態
執行Session對象的delete()方法,對象由游離狀態轉為瞬時狀態。
處于瞬時狀態或游離狀態的對象不再被其他對象引用時,會被Java虛擬機按照垃圾回收機制處理。
需求:為以下兩段代碼補充語句,輸出各個階段對象的狀態。
代碼1:
1 try{ 2 // 省略部分代碼... 3 session = sessionFactory.openSession(); 4 tx = session.beginTransaction(); // 開始一個事務 5 User user = (User)session.load(User.class, new Integer("1001")); // 獲取用戶對象 6 user.setUsername("張董"); // 修改用戶信息 7 tx.commit(); // 提交事務 8 }catch(HibernateException e){ 9 e.PRintStackTrace();10 tx.rollback(); // 回滾事務11 }finally{12 if(null != session){13 session.close(); // 關閉session14 }15 }
代碼2:
1 try{ 2 // 省略部分代碼 3 session = sessionFactory.openSession(); // 打開session 4 tx = session.beginTransaction(); // 開始一個事務 5 User user = (User)session.load(User.class, new Integer("1000")); // 獲取User對象 6 session.delete(user); // 持久化操作 - 刪除 7 tx.commit(); // 提交事務 8 }catch(HibernateException e){ 9 e.printStackTrace();10 tx.rollback(); // 回滾事務11 }finally{12 if(null != session){13 session.close(); // 關閉session14 }15 }
新聞熱點
疑難解答