国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

Hibernate入門04-Hibernate中Java對象的三種狀態(tài)

2019-11-14 15:09:45
字體:
供稿:網(wǎng)友

 

目錄:(后續(xù)不斷更新...)

  1. Hibernate 入門 01 - 框架技術(shù) (介紹Hibernate框架的發(fā)展由來)
  2. Hibernate 入門 02 - Hibernate介紹及其環(huán)境搭建
  3. Hibernate 入門 03 - 使用Hibernate完成持久化操作
  4. Hibernate 入門 04 - Hibernate中java對象的三種狀態(tài)

 

  

 ▁▃▅ Hibernate中Java對象的三種狀態(tài)▅▃▁

 

 

 

1. Java對象的三種狀態(tài)

  當(dāng)應(yīng)用通過調(diào)用Hibernate API與框架發(fā)生交互時,需要從持久化的角度關(guān)注應(yīng)用對象的生命周期。

  持久化聲明周期是Hibernate中的一個關(guān)鍵概念,正確地理解生命周期,可以更好地了解Hibernate的實現(xiàn)原理,掌握Hibernate的正確用法。

  Hibernate框架通過session來管理Java對象的狀態(tài),在持久化生命周期中,Java對象存在著如下三種狀態(tài):

 

  • 瞬時狀態(tài)(Transient)

  通過new創(chuàng)建對象后,對象并沒有l(wèi)ike持久化,它并未與數(shù)據(jù)庫中的數(shù)據(jù)有任何關(guān)聯(lián),此時Java對象的狀態(tài)為瞬時狀態(tài)。

  Session對于瞬時狀態(tài)的Java對象是一無所知的,當(dāng)對象不再被其他對象引用時,它的所有數(shù)據(jù)也就丟失了,對象將會被Java虛擬機按照垃圾回收機制處理。

  • 持久狀態(tài)(Persistent)

  當(dāng)對象與Session關(guān)聯(lián),被Session管理時,它就處于持久狀態(tài)。處于持久狀態(tài)的對象擁有數(shù)據(jù)庫標(biāo)識(數(shù)據(jù)庫中的主鍵值)。

  那么,對象是什么時候與Session發(fā)生關(guān)聯(lián)的呢?有兩種方法:

    第一種,通過Sesison的查詢接口,或者get()方法,或者load()方法從數(shù)據(jù)庫中加載對象的時候,加載的對象是與數(shù)據(jù)庫表中的一條記錄關(guān)聯(lián)的,此時對象與加載它的Session發(fā)生關(guān)聯(lián);

    第二種,瞬時狀態(tài)的對象,通過Session的save()方法或SaveOrUpdate()方法時,Java對象也與Session發(fā)生關(guān)聯(lián)。

  對于處于持久狀態(tài)的對象,Session會持續(xù)跟蹤和管理它們,如果對象的內(nèi)部狀態(tài)發(fā)生了任何變更,Hibernate會選擇合適的時機(如事務(wù)提交時)將變更固化到數(shù)據(jù)庫中。

  • 游離狀態(tài)

  處于持久狀態(tài)的對象,脫離與其關(guān)聯(lián)的nSession的管理后,對象就處于游離狀態(tài)。

  處于游離狀態(tài)的對象,Session無法保證對象所包含的數(shù)據(jù)與數(shù)據(jù)庫中的記錄一直,因為Hibernate已經(jīng)無法感知對該對象的任何操作。

  Session提供了兩個方法(update()、merge()),將處于游離狀態(tài)的對象,與一個新的Session發(fā)生關(guān)聯(lián)。

  此時,對象的狀態(tài)就從游離狀態(tài)重新轉(zhuǎn)換為持久狀態(tài)。

 

 

 

 

 

2. 三種狀態(tài)之間的轉(zhuǎn)換

  在Hibernate應(yīng)用中,不同的持久化操作會導(dǎo)致對象狀態(tài)的改變。如圖描述了對象狀態(tài)的轉(zhuǎn)換:

 

  使用new關(guān)鍵字構(gòu)建對象,該對象的狀態(tài)是瞬時狀態(tài)。

2.1 瞬時狀態(tài)轉(zhuǎn)為持久狀態(tài)

  使用Session對象的save()或saveOrUpdate()方法保存對象后,該對象的狀態(tài)由瞬時狀態(tài)轉(zhuǎn)換為持久狀態(tài)。

  使用Session對象的get()或load()方法獲取對象,該對象的狀態(tài)是持久狀態(tài)。

2.2 持久狀態(tài)轉(zhuǎn)為瞬時狀態(tài)

  執(zhí)行Session對象的delete()方法后,對象由原來的持久狀態(tài)變?yōu)樗矔r狀態(tài),因為此時該對象沒有與任何的數(shù)據(jù)庫數(shù)據(jù)關(guān)聯(lián)。

2.3 持久狀態(tài)轉(zhuǎn)為游離狀態(tài)

  吃行了Session對象的evict()、clear()或close()方法,對象由原來的持久狀態(tài)轉(zhuǎn)為游離狀態(tài)。

2.4 游離狀態(tài)轉(zhuǎn)為持久狀態(tài)

  重新獲取Session對象,執(zhí)行Session對象的update()或saveOrUpdate()方法,對象由游離狀態(tài)轉(zhuǎn)為持久狀態(tài),該對象再次與Session對象相關(guān)聯(lián)。

2.5 游離狀態(tài)轉(zhuǎn)為瞬時狀態(tài)

  執(zhí)行Session對象的delete()方法,對象由游離狀態(tài)轉(zhuǎn)為瞬時狀態(tài)。

  處于瞬時狀態(tài)或游離狀態(tài)的對象不再被其他對象引用時,會被Java虛擬機按照垃圾回收機制處理。

 

 

 

 

3. 練習(xí)(好記性不如爛鍵盤) - 輸出對象的狀態(tài)

  需求:為以下兩段代碼補充語句,輸出各個階段對象的狀態(tài)。

  代碼1:

 1 try{ 2     // 省略部分代碼... 3     session = sessionFactory.openSession(); 4     tx = session.beginTransaction();    // 開始一個事務(wù) 5     User user = (User)session.load(User.class, new Integer("1001"));    // 獲取用戶對象 6     user.setUsername("張董");    // 修改用戶信息 7     tx.commit();    // 提交事務(wù) 8 }catch(HibernateException e){ 9     e.PRintStackTrace();10     tx.rollback();    // 回滾事務(wù)11 }finally{12     if(null != session){13         session.close();    // 關(guān)閉session14     }15 }

  代碼2:

 1 try{ 2     // 省略部分代碼 3     session = sessionFactory.openSession();    // 打開session 4     tx = session.beginTransaction();    // 開始一個事務(wù) 5     User user = (User)session.load(User.class, new Integer("1000"));    // 獲取User對象 6     session.delete(user);    // 持久化操作 - 刪除 7     tx.commit();    // 提交事務(wù) 8 }catch(HibernateException e){ 9     e.printStackTrace();10     tx.rollback();    // 回滾事務(wù)11 }finally{12     if(null != session){13         session.close();    // 關(guān)閉session14     }15 }

 


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 桂林市| 西华县| 且末县| 洛宁县| 灵山县| 彩票| 巴南区| 漳平市| 五台县| 东乌珠穆沁旗| 黔西县| 镇赉县| 诸城市| 固安县| 梨树县| 乌审旗| 进贤县| 芜湖市| 手游| 德令哈市| 区。| 康保县| 盈江县| 新宾| 那坡县| 任丘市| 磐石市| 呼伦贝尔市| 陆丰市| 新巴尔虎左旗| 贺兰县| 比如县| 澄江县| 共和县| 普洱| 翁源县| 建平县| 彭水| 五原县| 岢岚县| 和龙市|