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

          本帖匯總了網(wǎng)上幾篇關(guān)于hibernate的生命周期的帖子。

          轉(zhuǎn)載:

          實(shí)體對(duì)象的生命周期在Hibernate應(yīng)用中是一個(gè)很關(guān)鍵的概念,正確的理解實(shí)體對(duì)象的生命周期將對(duì)我們應(yīng)用Hibernate做持久層設(shè)計(jì)起到很大的作用.而所謂的實(shí)體對(duì)象的生命周期就是指實(shí)體對(duì)象由產(chǎn)生到被GC回收的一段過(guò)程.在這過(guò)程中我們需要理解的就是實(shí)體對(duì)象生命周期中的三種狀態(tài).

          1. 自由狀態(tài)(Transient)
          所謂的Transient狀態(tài),即實(shí)體對(duì)象在內(nèi)存中自由存在,與數(shù)據(jù)庫(kù)中的記錄無(wú)關(guān),通常是我們的J2EE中 VO,并沒(méi)有被納入Hibernate的實(shí)體管理容器.

          1    Test test = new Test();
          2        test.setName("energykk");
          3        //此時(shí)的test對(duì)象處于Transient(自由狀態(tài))并沒(méi)有被Hibernate框架所管理
          4        

          2.持久狀態(tài)(Persistent)
          何謂 Persistent? 即實(shí)體對(duì)象已經(jīng)處于被Hibernate實(shí)體管理容器容器所管理的狀態(tài).這種狀態(tài)下這個(gè)實(shí)體對(duì)象的引用將被納入Hibernate實(shí)體管理容器容器所管理.
          處于Persistent狀態(tài)的實(shí)體對(duì)象,對(duì)它的變更也將被固化到數(shù)據(jù)庫(kù)中.
          在J2EE中通常指的是一個(gè)PO.
          Transaction tr = session.beginTransaction();
                  session.save(test);
                  
          //此時(shí)的test對(duì)象已經(jīng)處于Persistent(持久狀態(tài))它被Hibernate 納入實(shí)體管理容器
                  tr.commit();
                  Transaction tr2 
          = session.beginTransaction();
                  test.setName(
          "xukai");
                  
          //在這個(gè)事務(wù)中我們并沒(méi)有顯示的調(diào)用save()方法但是由于Persistent狀態(tài)的對(duì)象將會(huì)自動(dòng)的固化到
                  
          //數(shù)據(jù)庫(kù)中,因此此時(shí)正處在Persistent狀態(tài)的test對(duì)象的變化也將自動(dòng)被同步到數(shù)據(jù)庫(kù)中
                  tr2.commit();

          處于Persistent狀態(tài)的實(shí)體可以簡(jiǎn)單的理解為:如果一個(gè)實(shí)體對(duì)象與session發(fā)生了關(guān)聯(lián),并且處于session的有效期內(nèi),那么這個(gè)實(shí)體對(duì)象就處于Persistent狀態(tài).

          3.游離狀態(tài)(Detached)
          處于Persistent狀態(tài)的實(shí)體對(duì)象,其對(duì)應(yīng)的session關(guān)閉以后,那么這個(gè)實(shí)體就處于 Detached狀態(tài).
          我們可以認(rèn)為session對(duì)象就是一個(gè)Persistent的宿主,一旦這個(gè)宿主失效,那么這個(gè)實(shí)體就處于 Detached狀態(tài).

          session.close();
                  
          //與test對(duì)象關(guān)聯(lián)的session被關(guān)閉,因此此時(shí)的test對(duì)象進(jìn)入 Detached(游離狀態(tài))
                  
                  session2 
          = HibernateSessionFactory.getSession();
                  Transaction tr3 
          = session2.beginTransaction();
                  session2.update(test);
                  
          //此時(shí)正處于Detached狀態(tài)的test對(duì)象由于再次借助與session2被納入到Hibernate的實(shí)體管理容器所以此時(shí)的
                  
          //test對(duì)象恢復(fù)到Persistent狀態(tài)
                  test.setName("jjjj");
                  tr3.commit();
                  
                  session2.close();

          既然Transient狀態(tài)的實(shí)體與Detached狀態(tài)的實(shí)體都與Hibernate的實(shí)體管理容器沒(méi)有關(guān)系,那他們到底存在哪些差異?
          差異就在于處于Transient狀態(tài)的只有一個(gè)Name的屬性.此時(shí)的test對(duì)象所包含的數(shù)據(jù)信息僅限于此,他與數(shù)據(jù)庫(kù)中的記錄沒(méi)有任何瓜葛.
          但是處于Detached狀態(tài)的實(shí)體已經(jīng)不止包含Name這個(gè)屬性,還被賦予了主鍵也就是通常POJO里的id屬性,由于id是主鍵,他可以確定數(shù)據(jù)庫(kù)表中的一條
          唯一的記錄,那么自然的處于Detached狀態(tài)的實(shí)體就能與數(shù)據(jù)庫(kù)表中擁有相同id的記錄相關(guān)聯(lián).
          這就是他們之間所存在的差異, 簡(jiǎn)而言之,Transient狀態(tài)的實(shí)體缺乏與數(shù)據(jù)庫(kù)表記錄之間的聯(lián)系,而Detached狀態(tài)的試題恰恰相反.只不過(guò)是脫離了session這個(gè)數(shù)據(jù)庫(kù)操作平臺(tái)而已.
          原帖地址 : http://www.aygfsteel.com/energykk/archive/2007/05/08/115927.html

           生命周期圖:
          原圖地址:http://hi.baidu.com/quest2run/blog/item/39e1d08c7dbd45f4503d9222.html
           

          persistence context



          生命周期特征總結(jié) :
          原帖地址 : http://blog.csdn.net/hgd250/archive/2008/08/06/2775943.aspx
          Transient:

              與數(shù)據(jù)庫(kù)中的記錄沒(méi)有任何關(guān)系,即沒(méi)有與其相關(guān)聯(lián)的數(shù)據(jù)庫(kù)記錄.
              與session沒(méi)有任何關(guān)系.即沒(méi)有通過(guò)session對(duì)象的實(shí)例對(duì)其進(jìn)行任何持久化的操作
          Persistent:
              每個(gè)persistent狀態(tài)的實(shí)體對(duì)象都與一個(gè)session對(duì)象的實(shí)例相關(guān)聯(lián)
              處于 Persistent狀態(tài)的實(shí)體對(duì)象是與數(shù)據(jù)庫(kù)中的記錄相關(guān)聯(lián)的.
              Hibernate會(huì)依據(jù)persistent狀態(tài)的實(shí)體對(duì)象的屬性變化而改變數(shù)據(jù)庫(kù)中相對(duì)應(yīng)的記錄
          .
          Detached:
              游離態(tài)是由持久態(tài)實(shí)體對(duì)象轉(zhuǎn)變而來(lái)的.
              游離態(tài)實(shí)體不再與session對(duì)象相關(guān)聯(lián).
              游離態(tài)實(shí)體對(duì)象與數(shù)據(jù)庫(kù)中的記錄沒(méi)有直接聯(lián)系,對(duì)其所做的任何修改將不會(huì)影響到到數(shù)據(jù)庫(kù)中的數(shù)據(jù).
              游離態(tài)實(shí)體對(duì)象在數(shù)據(jù)庫(kù)有相對(duì)應(yīng)的數(shù)據(jù)記錄,如果沒(méi)有被其他事務(wù)刪除.

          posted on 2011-02-14 14:26 AK47 閱讀(339) 評(píng)論(0)  編輯  收藏 所屬分類: Hibernate


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          <2011年2月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272812345
          6789101112

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 富源县| 临高县| 调兵山市| 治县。| 潼关县| 贵州省| 冀州市| 新巴尔虎右旗| 永昌县| 宜都市| 淮安市| 新津县| 神木县| 阜康市| 青阳县| 安国市| 江陵县| 鹤山市| 浠水县| 乐至县| 禹州市| 双峰县| 潜江市| 资兴市| 诸城市| 甘孜| 新营市| 双柏县| 汶上县| 绩溪县| 青海省| 梁河县| 巴彦县| 扶绥县| 延庆县| 长宁县| 云龙县| 历史| 麻阳| 宜黄县| 筠连县|