中文字幕第五页-中文字幕第页-中文字幕韩国-中文字幕最新-国产尤物二区三区在线观看-国产尤物福利视频一区二区

Hibernate對象狀態之間的轉換方式

這篇文章主要介紹“Hibernate對象狀態之間的轉換方式”,在日常操作中,相信很多人在Hibernate對象狀態之間的轉換方式問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Hibernate對象狀態之間的轉換方式”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

10年積累的成都做網站、成都網站建設、成都外貿網站建設經驗,可以快速應對客戶對網站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網絡服務。我雖然不認識你,你也不認識我。但先網站設計后付款的網站建設流程,更有吳川免費網站建設讓你可以放心的選擇與我們合作。

狀態分類

在Hibernate框架中,為了管理持久化類,Hibernate將其分為了三個狀態:

瞬時態(Transient Object)  持久態(Persistent Object)  脫管態(Detached Object)

有很多人好像對這些概念和它們之間的轉換不太明白,那么本篇文章就是來解決這些問題的,看完了還不會你來找我。(開個玩笑~~)

詳細描述

我們先來詳細地了解一下三種狀態:

1、瞬時態

對象由new操作符創建,且尚未與Hibernate中的Session關聯的對象被認為處于瞬時態。瞬時態對象不會被持久化到數據庫中,也不會賦予持久化標識,如果程序中失去了瞬時態對象的引用,瞬時態對象將被垃圾回收機制銷毀。

2、持久態

持久化實例在數據庫中有對應的記錄,并擁有一個持久化標識。持久化的實例可以是剛剛保存的,也可以是剛剛被加載的。無論哪一種,持久化對象都必須與指定的Session對象關聯。

3、脫管態

某個實例曾經處于持久化狀態,但隨著與之關聯的Session被關閉,該對象就變成脫管狀態。脫管狀態的引用引用依然有效,對象可繼續被修改。如果重新讓脫管對象與某個Session關聯,該脫管對象會重新轉換為持久化狀態。

瞬時態      持久態      脫管態              是否存于Session緩存中      ×      √      ×              數據庫中是否有對應記錄      ×      √      √

例如:

public class HibernateTest {private Session session;private Transaction transaction;@Beforepublic void before() {session = HibernateUtil.getSession();transaction = session.beginTransaction();}@Afterpublic void after() {transaction.commit();session.close();}@Testpublic void test() {Person p = new Person();p.setPname("張三");p.setAge(20);session.save(p);}}

那么在這樣的一個例子中,從創建Person對象到給name和age屬性賦值,這些過程都處于瞬時態,而當調用了session對象的save()方法之后,該對象才從瞬時態轉為了持久態。而當session關閉之后,該對象又從持久態轉為了脫管態。

對象狀態之間的轉換

了解了三種對象狀態的相關概念后,我們來看一看三種對象狀態之間是如何神奇地相互轉換的。

瞬時態 <——> 持久態

我們知道當創建一個對象之后,該對象即為瞬時態,那么它將如何轉換為持久態呢?看一個例子:

@Testpublic void test() {Person p = new Person();p.setPid(2);p.setPname("李四");p.setAge(30);session.save(p);//session.saveOrUpdate(p);}

給name和age屬性賦值時,該對象仍然處于瞬時態,這個前面已經說過了。但需要注意的是,當給主鍵也就是Pid屬性賦值時,該對象將不再處于瞬時態,而是轉換為脫管態,因為此時已經有了持久化標識,但是并沒有與Session發生關聯。而當調用session對象的update()或者saveOrUpdate()方法時,該對象才會轉換為持久態。當然,調用session對象的get()、load()、query、find()等方法從數據庫中查詢得到的對象也處于持久態。而僅僅當session對象調用delete()方法將一個持久化的對象從數據庫中刪除后,該對象才從持久態轉為了瞬時態。

持久態 <——> 脫管態

當調用session對象的close()、clear()等方法后,該session所關聯的對象將從持久態轉為脫管態,此時這些對象失去了相關session的關聯。而要想從脫管態轉回持久態,只需調用save()、saveOrUpdate()等方法即可。

瞬時態 ——> 脫管態

這個前面也已經說過了,當創建對象后調用setXXX()方法設置主鍵屬性時,該對象就從瞬時態轉為脫管態,前提是這個主鍵是數據庫中存在的。

對象生命周期

下面以一個對象從創建到保存至數據庫的流程做一個分析:

try {Session session = HibernateUtil.openSession();//開始事務session.beginTransaction();//person對象進入瞬時狀態態Person p = new Person();p.setPname("王五");p.setAge(40);//person對象進入持久化狀態session.save(p);//提交事務,隱式包含了session.flush()的動作session.getTransaction().commit();//提交完成后,person處于游離狀態} catch (HibernateException e) {e.printStackTrace();if (session != null)session.getTransaction().rollback();} finally {if (session != null)session.close();}

當一個對象被實例化后,該對象是瞬時狀態,當調用session.save(Object)后,該對象被加入到session緩存中,進入持久化狀態,這時數據庫中還不存在對應的記錄。當session提交事務后,數據庫生成了對應的記錄,但是這里需要注意一點,因為事務提交的時候默認會去調用session.flush()方法來清空緩存,相當于調用了clear()方法,而我們知道,調用了clear()方法,對象會從持久態轉為脫管態。而處于脫管態的對象會被垃圾回收機制銷毀。這就是一個對象從創建到保存至數據庫的完整生命周期過程。

其它

對于對象狀態有了一定的了解之后,可以用來解釋很多現象。

在Hibernate中,唯有當對象從其它狀態轉為持久態時,它才會去自動生成sql語句,其它時候是不會去重復生成sql,這就是Hibernate框架提高效率的關鍵所在。

例如:

@Testpublic void test2() {Session session = HibernateUtil.getSession();Transaction transaction = session.beginTransaction();Person p = new Person();p.setPname("李四");p.setAge(30);session.save(p);p.setPname("王五");session.update(p);transaction.commit();session.close();}

我在transaction.commit();這條語句上打了一個斷電,然后調試運行。

可以看到,控制臺只輸出了一條sql語句,也就是執行save()方法時生成的插入語句,但是執行update()方法卻并沒有生成sql。這是因為在執行update()方法時,Hibernate框架會去判斷當前對象的狀態,它發現當前對象處于持久態,所以不重復生成sql,只是將持久態對象的值改變而已,然后調用commit()方法進行事務提交的時候才去生成更新語句。

我們繼續看一個例子:

@Testpublic void test2() {Session session = HibernateUtil.getSession();Transaction transaction = session.beginTransaction();Person p = new Person();p.setPname("張三");p.setAge(30);session.save(p);//此時該對象從瞬時態轉為持久態,生成sql語句p.setPname("王五");session.save(p);//此時該對象為持久態,不生成sql語句p.setPname("趙六");session.update(p);//此時該對象為持久態,不生成sql語句transaction.commit();session.close();}

你要知道,這跟你調用哪個方法是無關的,關鍵在于對象的狀態,只有轉為持久態時才會生成sql語句。所以上面的程序段依然只會產生兩條sql,一條是save()方法產生的,一條是commit()方法產生的??刂婆_信息如下:

Hibernate:   insert   into    PERSON    (PNAME, AGE)   values    (?, ?)Hibernate:   update    PERSON   set    PNAME=?,    AGE=?   where    PID=?

理解Hibernate的三種狀態,將更有利于理解Hibernate的運行機制,這些可以讓你在開發中對疑點問題的定位產生關鍵性的幫助。

到此,關于“Hibernate對象狀態之間的轉換方式”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注創新互聯網站,小編會繼續努力為大家帶來更多實用的文章!

網頁題目:Hibernate對象狀態之間的轉換方式
文章出自:http://www.2m8n56k.cn/article42/giochc.html

成都網站建設公司_創新互聯,為您提供云服務器、電子商務品牌網站設計、動態網站軟件開發、靜態網站

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:[email protected]。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都網頁設計公司
主站蜘蛛池模板: 欧美成人三级视频 | 久久国产成人精品 | 国产无卡一级毛片aaa | 成人毛片视频免费网站观看 | 亚洲精品第一第二区 | 在线观看中文字幕国产 | 三级视频网站在线观看播放 | 国产美女做爰免费视 | 国产美女做爰免费视频软件 | 亚洲综合精品成人 | 日本免费毛片 | 收集最新中文国产中文字幕 | 中国国产成人精品久久 | 欧美videos极品 | 亚洲欧美视频在线 | 欧美久久久久欧美一区 | 国产日韩欧美综合一区二区三区 | 亚洲偷偷自拍 | 亚洲精品久久久久综合中文字幕 | 国产视频高清在线观看 | 亚洲日韩中文字幕 | 久久国产精品视频一区 | 免费播放欧美毛片 | 欧美在线一级视频 | 好看欧美视频高清va | 香蕉福利久久福利久久香蕉 | 国内精品久久久久久影院老狼 | 在线a视频网站 | 国产图片亚洲精品一区 | 久久精品国产亚洲麻豆 | 一级毛片免费播放视频 | 欧美一区二区视频在线观看 | 国内精品伊人久久 | 国产一区二区在线视频播放 | 美国一级毛片片aa成人 | 色综合久久久久久 | 91tv成人影院免费 | 在线视频久| 久久精品久久精品久久 | 亚洲午夜精品一区二区 | 九九草在线观看 |