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

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

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

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

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

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

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

          2:持久狀態(tài)(Persistent)
          持久狀態(tài)(Persistent),即實(shí)體對(duì)象處于Hibernate框架的管理狀態(tài),實(shí)體對(duì)象被納入Hibernate的實(shí)體容器中管理。處于持久狀態(tài)的對(duì)象,其更變將由Hibernate固化到數(shù)據(jù)庫中。如:
          Java代碼
          1. //創(chuàng)建兩個(gè)處于自由狀態(tài)的實(shí)體對(duì)象。   
          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對(duì)象已經(jīng)被納入Hibernate的實(shí)體管理容器,處于持久化狀   
          11. //態(tài)(Persistent),這時(shí)候?qū)ser_1對(duì)象的任何修改都將被同步到數(shù)據(jù)庫中。   
          12.   
          13. tx.commit();   
          14.   
          15. //而user_2仍然才處于自由狀態(tài)(Transient),不受Hibernate框架的管理。  

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

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

          3:游離狀態(tài)(Detached)
          處于持久狀態(tài)的實(shí)體對(duì)象,在其關(guān)聯(lián)的Session關(guān)閉以后,此實(shí)體對(duì)象就處于游離狀態(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í)體對(duì)象user轉(zhuǎn)為持久狀態(tài),   
          5. tx.commit();   
          6. session.close();   
          7. //session關(guān)閉以后,處于持久狀態(tài)的實(shí)體對(duì)象user將轉(zhuǎn)為游離狀態(tài)。   
          8. //因?yàn)榇藭r(shí)user已經(jīng)和session脫離關(guān)系。  


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

          時(shí),我們只是創(chuàng)建了一個(gè)普通的對(duì)象,他并沒有和數(shù)據(jù)庫里的任何一條記錄對(duì)應(yīng),當(dāng)我們執(zhí)行
          Session.save以后,Hibernate就為user設(shè)置了一個(gè)主鍵,就是user.Id屬性,通過這個(gè)屬性,Hibernate就把user對(duì)象和數(shù)據(jù)庫里的記錄關(guān)聯(lián)起來,所以自由狀態(tài)游離狀態(tài)的基本區(qū)別就是 處于游離狀態(tài)的實(shí)體對(duì)象,在數(shù)據(jù)庫里有對(duì)應(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)的對(duì)象
          持久狀態(tài)-->自由狀態(tài):可以通過Session.delete方法來刪除實(shí)體對(duì)象對(duì)應(yīng)的數(shù)據(jù)庫記錄,使實(shí)體對(duì)象處于自由狀態(tài)。

          補(bǔ)充一下,有時(shí)可能會(huì)想,可以通過認(rèn)為的個(gè)處于自由狀態(tài)的實(shí)體對(duì)象設(shè)置一個(gè)Id值
          Java代碼
          1. user.Id=1  
          ,來人為的創(chuàng)建一個(gè)游離狀態(tài)的對(duì)象。
          這里注意一點(diǎn),我們可以人為地給實(shí)體對(duì)象設(shè)置Id值,我我們無法知道這個(gè)ID值在數(shù)據(jù)庫里有沒有對(duì)應(yīng)的記錄,如果沒有,就算我們?nèi)藶榈卦O(shè)置了Id,也不能說一個(gè)有ID的實(shí)體對(duì)象就是一個(gè)游離狀態(tài)的對(duì)象。
          posted on 2009-04-08 12:02 lanxin1020 閱讀(257) 評(píng)論(0)  編輯  收藏 所屬分類: hibernate
          主站蜘蛛池模板: 河西区| 西峡县| 营口市| 健康| 玉树县| 无锡市| 长武县| 富蕴县| 大名县| 饶阳县| 昌平区| 东宁县| 通化县| 荃湾区| 万州区| 商水县| 林西县| 灵川县| 准格尔旗| 镇宁| 兴宁市| 阿拉善盟| 祁阳县| 平山县| 缙云县| 宾川县| 五峰| 翼城县| 丹阳市| 怀集县| 渝中区| 迭部县| 高雄市| 临洮县| 宁蒗| 蓬溪县| 封开县| 九江县| 定远县| 行唐县| 会东县|