<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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.tkk7.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 閱讀(333) 評論(0)  編輯  收藏 所屬分類: Hibernate


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


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

    導航

    統計

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲一卡2卡3卡4卡乱码 在线| 亚洲三级电影网站| 亚洲欧好州第一的日产suv| 一个人免费观看在线视频www | 亚洲AV无码乱码在线观看| 亚洲AV无码男人的天堂| 午夜网站免费版在线观看| 亚洲人成无码网站在线观看 | 亚洲午夜无码片在线观看影院猛 | 日韩欧美亚洲国产精品字幕久久久| 好男人www免费高清视频在线| 中国china体内裑精亚洲日本| 青青久在线视频免费观看| 亚洲乱妇熟女爽到高潮的片| 国产成人无码免费视频97| 一本岛v免费不卡一二三区| 亚洲综合伊人久久大杳蕉| 久久狠狠躁免费观看2020| 亚洲丝袜中文字幕| 国产色爽女小说免费看| 一级一级毛片免费播放| 2022年亚洲午夜一区二区福利 | 6080午夜一级毛片免费看| 亚洲成人免费在线观看| 免费观看一级毛片| 一级毛片试看60分钟免费播放| 久久亚洲国产视频| 最近免费中文字幕4| 国产成人综合亚洲绿色| 亚洲日韩小电影在线观看| 97视频免费在线| 免费看又黄又爽又猛的视频软件 | 国产精品亚洲一区二区三区在线| 久久成人国产精品免费软件| 亚洲精品美女久久7777777 | 亚洲国产韩国一区二区| 国产一区二区三区无码免费| 久久精品免费观看国产| 男女超爽视频免费播放| 久久亚洲AV无码精品色午夜麻豆| 日本免费一区尤物|