Hibernate 實體對象的生命周期匯總

          本帖匯總了網上幾篇關于hibernate的生命周期的帖子。

          轉載:

          實體對象的生命周期在Hibernate應用中是一個很關鍵的概念,正確的理解實體對象的生命周期將對我們應用Hibernate做持久層設計起到很大的作用.而所謂的實體對象的生命周期就是指實體對象由產生到被GC回收的一段過程.在這過程中我們需要理解的就是實體對象生命周期中的三種狀態.

          1. 自由狀態(Transient)
          所謂的Transient狀態,即實體對象在內存中自由存在,與數據庫中的記錄無關,通常是我們的J2EE中 VO,并沒有被納入Hibernate的實體管理容器.

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

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

          處于Persistent狀態的實體可以簡單的理解為:如果一個實體對象與session發生了關聯,并且處于session的有效期內,那么這個實體對象就處于Persistent狀態.

          3.游離狀態(Detached)
          處于Persistent狀態的實體對象,其對應的session關閉以后,那么這個實體就處于 Detached狀態.
          我們可以認為session對象就是一個Persistent的宿主,一旦這個宿主失效,那么這個實體就處于 Detached狀態.

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

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

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

          persistence context



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

              與數據庫中的記錄沒有任何關系,即沒有與其相關聯的數據庫記錄.
              與session沒有任何關系.即沒有通過session對象的實例對其進行任何持久化的操作
          Persistent:
              每個persistent狀態的實體對象都與一個session對象的實例相關聯
              處于 Persistent狀態的實體對象是與數據庫中的記錄相關聯的.
              Hibernate會依據persistent狀態的實體對象的屬性變化而改變數據庫中相對應的記錄
          .
          Detached:
              游離態是由持久態實體對象轉變而來的.
              游離態實體不再與session對象相關聯.
              游離態實體對象與數據庫中的記錄沒有直接聯系,對其所做的任何修改將不會影響到到數據庫中的數據.
              游離態實體對象在數據庫有相對應的數據記錄,如果沒有被其他事務刪除.

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


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2011年2月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272812345
          6789101112

          導航

          統計

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 惠来县| 隆德县| 中西区| 开化县| 分宜县| 白玉县| 柳林县| 洪湖市| 霍城县| 安平县| 十堰市| 南涧| 阿拉善盟| 阳城县| 淳安县| 芜湖市| 隆尧县| 东乌珠穆沁旗| 平武县| 屏南县| 文水县| 石景山区| 大埔区| 礼泉县| 梓潼县| 衡水市| 京山县| 施秉县| 罗定市| 克拉玛依市| 普安县| 邢台县| 兴义市| 本溪市| 九江县| 昌邑市| 连州市| 泸水县| 大英县| 晋宁县| 察雅县|