隨筆 - 63  文章 - 0  trackbacks - 0
          <2009年4月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          Hibernate實(shí)體對象的生命周期

          關(guān)鍵字: hibernate學(xué)習(xí)筆記
          在用Hibernate的時(shí)候,時(shí)不時(shí)會(huì)因?yàn)闆]有處理好實(shí)體對象的狀態(tài)而犯一些莫名其妙的異常,在這里對實(shí)體對象的各種狀態(tài)整理一下,希望能有所幫助。

          Hibernate實(shí)體對象,即指Hibernate O/R影射關(guān)系中的域?qū)ο?即O/R中的"O"。在Hibrenate實(shí)體對象的生命周期中存在著三中狀態(tài),即:
          1:自由狀態(tài)(Transient)。
          2:持久狀態(tài)(Persistent)。
          3:游離狀態(tài)(Detached)。

          1:自由狀態(tài)(Transient)
          自由狀態(tài)(Transient),是指實(shí)體對象在內(nèi)存中自由存在,他與數(shù)據(jù)庫的記錄無關(guān)。如:
          Java代碼
          1. TUser user = new TUser();   
          2. user.setName("MyName");  

          這里的user對象只是一個(gè)非常普通的java對象,與數(shù)據(jù)庫中的記錄沒有任何關(guān)系。

          2:持久狀態(tài)(Persistent)
          持久狀態(tài)(Persistent),即實(shí)體對象處于Hibernate框架的管理狀態(tài),實(shí)體對象被納入Hibernate的實(shí)體容器中管理。處于持久狀態(tài)的對象,其更變將由Hibernate固化到數(shù)據(jù)庫中。如:
          Java代碼
          1. //創(chuàng)建兩個(gè)處于自由狀態(tài)的實(shí)體對象。   
          2. TUser user_1 = new TUser();   
          3. TUser user_2 = new TUser();   
          4.   
          5. user_1.setName("Name_1");   
          6. user_2.setName("Name_2");   
          7.   
          8. Transaction tx = session.begintransaction();   
          9. session.save(user_1);   
          10. //通過session的save方法,user_1對象已經(jīng)被納入Hibernate的實(shí)體管理容器,處于持久化狀   
          11. //態(tài)(Persistent),這時(shí)候?qū)ser_1對象的任何修改都將被同步到數(shù)據(jù)庫中。   
          12.   
          13. tx.commit();   
          14.   
          15. //而user_2仍然才處于自由狀態(tài)(Transient),不受Hibernate框架的管理。  

          從上面看到,處于自由狀態(tài)的實(shí)體對象,可以通過Hibernate的Session.sava方法轉(zhuǎn)化為持久狀態(tài)
          除了用Session.save方法外,還可以通過其他方法來獲取一個(gè)持久狀態(tài)的對象,那就是直接通過Hibernate加載的對象,通過Session.load方法,可以直接加載一個(gè)處于持久狀態(tài)的實(shí)體對象。如下:
          Java代碼
          1. TUser user = Session.load(TUser.class,new Integer(1));   
          2. //在load方法沒返回之前,就已經(jīng)先把對象納入Hibernate的管理范圍,所以這里的user   
          3. //已經(jīng)處于持久狀態(tài)。  

          從上面的代碼可以看出,處于持久狀態(tài)的實(shí)體對象一定要和Session關(guān)聯(lián),并處于該Session的有效期內(nèi)。

          3:游離狀態(tài)(Detached)
          處于持久狀態(tài)的實(shí)體對象,在其關(guān)聯(lián)的Session關(guān)閉以后,此實(shí)體對象就處于游離狀態(tài)
          Java代碼
          1. TUser user = new TUser();   
          2. user.setName("name_1");   
          3. Transaction tx = session.begintransaction();   
          4. session.save(user);//把自由狀態(tài)的實(shí)體對象user轉(zhuǎn)為持久狀態(tài),   
          5. tx.commit();   
          6. session.close();   
          7. //session關(guān)閉以后,處于持久狀態(tài)的實(shí)體對象user將轉(zhuǎn)為游離狀態(tài)。   
          8. //因?yàn)榇藭r(shí)user已經(jīng)和session脫離關(guān)系。  


          由上面可以看到實(shí)體對象的游離狀態(tài)是在對象和它所寄宿的Session脫離關(guān)系后形成的,但處于自由狀態(tài)的實(shí)體對象也沒有和任何session有關(guān)聯(lián),那么他們兩者有什么區(qū)別呢?關(guān)鍵的就在我們對自由狀態(tài)的實(shí)體對象執(zhí)行了Session.save方法,
          當(dāng)我們執(zhí)行
          Java代碼
          1. TUser user = new TUser();  

          時(shí),我們只是創(chuàng)建了一個(gè)普通的對象,他并沒有和數(shù)據(jù)庫里的任何一條記錄對應(yīng),當(dāng)我們執(zhí)行
          Session.save以后,Hibernate就為user設(shè)置了一個(gè)主鍵,就是user.Id屬性,通過這個(gè)屬性,Hibernate就把user對象和數(shù)據(jù)庫里的記錄關(guān)聯(lián)起來,所以自由狀態(tài)游離狀態(tài)的基本區(qū)別就是 處于游離狀態(tài)的實(shí)體對象,在數(shù)據(jù)庫里有對應(yīng)的記錄,因此它可以通過和session關(guān)聯(lián)再次轉(zhuǎn)為持久狀態(tài)。

          三種狀態(tài)的轉(zhuǎn)化
          自由狀態(tài)-->持久狀態(tài):可以通過Session.sava方法來轉(zhuǎn)換。
          持久狀態(tài)-->游離狀態(tài):可以通過Session.close方法來關(guān)閉session,獲取游離狀態(tài)的對象
          持久狀態(tài)-->自由狀態(tài):可以通過Session.delete方法來刪除實(shí)體對象對應(yīng)的數(shù)據(jù)庫記錄,使實(shí)體對象處于自由狀態(tài)。

          補(bǔ)充一下,有時(shí)可能會(huì)想,可以通過認(rèn)為的個(gè)處于自由狀態(tài)的實(shí)體對象設(shè)置一個(gè)Id值
          Java代碼
          1. user.Id=1  
          ,來人為的創(chuàng)建一個(gè)游離狀態(tài)的對象。
          這里注意一點(diǎn),我們可以人為地給實(shí)體對象設(shè)置Id值,我我們無法知道這個(gè)ID值在數(shù)據(jù)庫里有沒有對應(yīng)的記錄,如果沒有,就算我們?nèi)藶榈卦O(shè)置了Id,也不能說一個(gè)有ID的實(shí)體對象就是一個(gè)游離狀態(tài)的對象。
          posted on 2009-04-08 12:02 lanxin1020 閱讀(257) 評論(0)  編輯  收藏 所屬分類: hibernate
          主站蜘蛛池模板: 旺苍县| 大丰市| 沙雅县| 固阳县| 松溪县| 湟源县| 安西县| 家居| 新绛县| 方正县| 奈曼旗| 玉环县| 敖汉旗| 青神县| 桂东县| 丽水市| 德昌县| 桦川县| 敦煌市| 盐城市| 田林县| 临城县| 花莲市| 灵璧县| 安化县| 磐石市| 昭通市| 安国市| 宁晋县| 棋牌| 吉林省| 海兴县| 依兰县| 广平县| 两当县| 石阡县| 营山县| 兖州市| 宝山区| 当涂县| 榕江县|