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

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

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

    心無痕的博客

    常用鏈接

    統計

    積分與排名

    JAVA技術文檔

    JAVA精典網站

    開發工具

    數據庫

    最新評論

    深入淺出hibernate之PO,VO,load,get

    今天老師重新詳細講解了hibernate 里的POVO.

          最開始理解的POVO,感覺就是通過SAVE()方法,將OBJ 持久化到數據庫.如果要UPDATE,只要將oBJ 里屬性SET一個新值,然后執行下UPDATE就好(這是種錯誤的概念),因為那時還沒怎么接觸POVO,一開始看到這個已經感到很強大了,馬上就在腦子中記住了POVO.
          本以為在項目中可以得心應手的利用這個好處,結果錯誤的理解讓我出了很多異常:
          a different object with the same identifier value was already associated with the session;
          上面就是其中一個,原因是對于POVO的理解錯誤,引起的,先看下面的一段代碼:
            Cat princess = new Cat();//新建一個Cat對象
      princess.setId("402881830c2cf0f3010c2cf0f8b40001");//將對象set一個數據庫中已存在的ID
      princess.setName("Princess");
      princess.setSex('F');
      princess.setWeight(18.8f);
      
      Cat princess2 = new Cat();//又新建一個Cat對象
      princess2.setId("402881830c2cf0f3010c2cf0f8b40001");//同時將這個對象也set相同的ID
      princess2.setName("Princess");
      princess2.setSex('F');
      princess2.setWeight(19.8f);
      
      Session session = HibernateSessionFactory.currentSession();//好戲出場了,我們先current a Session
      Transaction tx = session.beginTransaction();//開始事物(Transaction到底是什么也不太懂,我只知道它可以將緩存中數據寫入數據庫)
    //  Cat c = (Cat)session.load(Cat.class, "402881830c2cf0f3010c2cf0f8b40001");
    //  c.setWeight(20.3f);
      session.saveOrUpdate(princess);//此時我們用session保存了princess,這之后的princess應該是持久化了,成了PO
      session.saveOrUpdate(princess2);//如果按我一開始的理解,此時princess2應該也是可以持久化的(看上面蘭色部分),因為princess2只是將princess更新了而已(這是致命的錯誤).
      tx.commit();
      
      HibernateSessionFactory.closeSession();
      
       執行的結果總是那么諷刺, a different object with the same identifier value was already associated with the session
       遇到了問題,總是最讓人興奮與無奈的時候.還是來看看為什么出錯吧:
      首先來講講POVO,PO又名persistence object,持久化對象,是指在對象通過save(),update(),load(),get();后,在session的Entity map實體容器里將持久話的對象add進去,也就是說,在我session.saveOrUpdate(princess);時,實體容器里已經將key和對象加入了.因為map是通過不同key來加OBJ的,而在hibernate里ID是唯一標識,使用ID來當做key是最好不過的了.因此Session 的實體容器只能加入一個id的對象.當session.saveOrUpdate(princess2);的時候,session準備把princess2也add到entityMap里時,由于相同的id,也就是key,它就報異常了a different object with the same identifier ..恭喜中標.
     
      也就是說PO是在session 的實體容器里可引用的對象,當我要更新PO時,可以set一個屬性值,然后只要tx.commit();動作,就可以更新了(讓我個人感到非常驚訝的地方).
      除了save();之外,同樣通過load,update,get也可以獲得PO.不過load和get有一少許區別(在使用的版本3.0中),get(id)就直接把DO獲得(馬上執行select操作),而load則不同,它會先對要load的ID做個標記,當要使用這個導出的對象時,它再執行.用上面的例子:
     
        Cat c = (Cat)session.load(Cat.class, "402881830c2cf0f3010c2cf0f8b40001");//此時只是做標記
        c.setWeight(20.3f);//這個時候才真正的執行了select 語句.

    posted on 2008-04-09 12:58 心無痕 閱讀(1658) 評論(1)  編輯  收藏 所屬分類: JAVA

    評論

    # re: 深入淺出hibernate之PO,VO,load,get 2008-12-15 12:39 雨吻春

    這個似乎跟事務提交的時候有關而已,更新丟失的問題  回復  更多評論   

    主站蜘蛛池模板: 污视频网站免费观看| 亚洲熟妇成人精品一区| 一区二区三区免费视频观看 | 91视频免费观看高清观看完整| 免费大香伊蕉在人线国产| 亚洲精品无码久久久久久| 国产色婷婷精品免费视频| 久久无码av亚洲精品色午夜| 国产成人免费A在线视频| 粉色视频免费入口| 亚洲欧洲中文日韩久久AV乱码| 女人裸身j部免费视频无遮挡| 亚洲精品线路一在线观看| 丁香花在线观看免费观看图片| 亚洲狠狠婷婷综合久久久久| 亚洲电影免费在线观看| 亚洲国产日韩在线| 韩国二级毛片免费播放| 一级毛片免费观看不收费| 国产l精品国产亚洲区在线观看| 一级毛片全部免费播放| 亚洲13又紧又嫩又水多| 国产大片51精品免费观看| 一级做a爰片久久免费| 亚洲综合无码一区二区| 国产成人精品免费视| 亚洲AV无码成人精品区狼人影院| 亚洲国产精品一区二区三区久久 | a毛片全部免费播放| 久久久久久亚洲Av无码精品专口| 曰曰鲁夜夜免费播放视频| 欧洲亚洲综合一区二区三区| 国产亚洲av人片在线观看| 久久久久久精品成人免费图片| 韩国亚洲伊人久久综合影院| 国产亚洲日韩一区二区三区| 日韩亚洲国产高清免费视频| 一级黄色毛片免费看| 亚洲国产美女在线观看 | 亚洲人成网站色在线观看| 久久国产成人精品国产成人亚洲 |