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

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

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

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

    常用鏈接

    留言簿(2)

    隨筆分類

    隨筆檔案

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    Hibernate實體對象的生命周期

    關鍵字: hibernate學習筆記
    在用Hibernate的時候,時不時會因為沒有處理好實體對象的狀態而犯一些莫名其妙的異常,在這里對實體對象的各種狀態整理一下,希望能有所幫助。

    Hibernate實體對象,即指Hibernate O/R影射關系中的域對象 即O/R中的"O"。在Hibrenate實體對象的生命周期中存在著三中狀態,即:
    1:自由狀態(Transient)。
    2:持久狀態(Persistent)。
    3:游離狀態(Detached)。

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

    這里的user對象只是一個非常普通的java對象,與數據庫中的記錄沒有任何關系。

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

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

    從上面的代碼可以看出,處于持久狀態的實體對象一定要和Session關聯,并處于該Session的有效期內。

    3:游離狀態(Detached)
    處于持久狀態的實體對象,在其關聯的Session關閉以后,此實體對象就處于游離狀態,
    Java代碼
    1. TUser user = new TUser();   
    2. user.setName("name_1");   
    3. Transaction tx = session.begintransaction();   
    4. session.save(user);//把自由狀態的實體對象user轉為持久狀態,   
    5. tx.commit();   
    6. session.close();   
    7. //session關閉以后,處于持久狀態的實體對象user將轉為游離狀態。   
    8. //因為此時user已經和session脫離關系。  


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

    時,我們只是創建了一個普通的對象,他并沒有和數據庫里的任何一條記錄對應,當我們執行
    Session.save以后,Hibernate就為user設置了一個主鍵,就是user.Id屬性,通過這個屬性,Hibernate就把user對象和數據庫里的記錄關聯起來,所以自由狀態游離狀態的基本區別就是 處于游離狀態的實體對象,在數據庫里有對應的記錄,因此它可以通過和session關聯再次轉為持久狀態。

    三種狀態的轉化
    自由狀態-->持久狀態:可以通過Session.sava方法來轉換。
    持久狀態-->游離狀態:可以通過Session.close方法來關閉session,獲取游離狀態的對象
    持久狀態-->自由狀態:可以通過Session.delete方法來刪除實體對象對應的數據庫記錄,使實體對象處于自由狀態。

    補充一下,有時可能會想,可以通過認為的個處于自由狀態的實體對象設置一個Id值
    Java代碼
    1. user.Id=1  
    ,來人為的創建一個游離狀態的對象。
    這里注意一點,我們可以人為地給實體對象設置Id值,我我們無法知道這個ID值在數據庫里有沒有對應的記錄,如果沒有,就算我們人為地設置了Id,也不能說一個有ID的實體對象就是一個游離狀態的對象。
    posted on 2009-04-08 12:02 lanxin1020 閱讀(255) 評論(0)  編輯  收藏 所屬分類: hibernate
    主站蜘蛛池模板: 蜜桃精品免费久久久久影院| 国产精品亚洲产品一区二区三区| 免费国产黄线在线观看| 亚洲一二成人精品区| 免费无码黄网站在线看| 亚洲春色在线视频| 久久久免费精品re6| 久久亚洲AV无码精品色午夜| 亚洲高清视频免费| 最新亚洲卡一卡二卡三新区 | 亚洲午夜精品在线| 足恋玩丝袜脚视频免费网站| 亚洲人成网站18禁止久久影院| 色se01短视频永久免费| 亚洲精华国产精华精华液网站| 免费jlzzjlzz在线播放视频| 国产精品福利片免费看| 亚洲中文字幕无码中文字在线 | 黑人粗长大战亚洲女2021国产精品成人免费视频 | 久久99九九国产免费看小说| 亚洲hairy多毛pics大全| 亚洲国产91精品无码专区| a级男女仿爱免费视频| 亚洲国语在线视频手机在线| 蜜桃精品免费久久久久影院| 在线观看免费无码视频| 亚洲最大的黄色网| 亚洲另类激情专区小说图片| 久久精品成人免费看| 91麻豆国产自产在线观看亚洲| 麻豆精品成人免费国产片| 国产v亚洲v天堂a无| 亚洲AV成人潮喷综合网| 免费国产黄网站在线观看动图| 国产精品亚洲精品日韩已满| 最近最新中文字幕完整版免费高清| 亚美影视免费在线观看| 亚洲五月综合缴情婷婷| 久久亚洲欧洲国产综合| 免费福利网站在线观看| 中文字幕看片在线a免费|