blog-moon

          導航

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          統計

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          Office

          Websphere

          數據庫

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          Hibernate的update與saveOrUpdate區別

          以下代碼運行在Hibernate 3.1.3下面,下面的代碼展示了不同情況或狀態的對象在作更新時可能發生的結果:
          ??????? session = HibernateUtil.currentSession();
          ??????? Example exp2 = null ;
          ??????? Example exp3 = null ;
          ??????? Example exp1 =null ;


          ??????? exp1 = (Example)session.load(Example.class,"1?");
          ??????? exp1.setExampleCode("exp99");
          ??????? HibernateUtil.closeSession();
          ????
          ?????? ?exp1.setExampleCode("1111");
          ??????? exp1.setCreateDate(DateUtil.getCurrentTimestamp());
          ????
          ????
          ?????? exp2 = new Example();
          ?????? exp2.setExampleID("2");
          ?????? exp2.setExampleCode("2222");
          ????? ?exp2.setCreateDate(DateUtil.getCurrentTimestamp());

          ?????? exp3 = new Example();
          ?????? exp3.setExampleID("4");
          ?????? exp3.setExampleCode("4444");
          ?????? exp3.setCreateDate(DateUtil.getCurrentTimestamp());
          ????
          ????
          ????? ?session = HibernateUtil.currentSession();
          ??????? tx = session.beginTransaction();
          ???????
          ??????? session.update(exp1);
          ??????
          ?????? session.update(exp2);
          ??
          ?????? session.update(exp3);
          ??
          ?????? tx.commit();
          ???? ?HibernateUtil.closeSession();
          ??
          這里面有三種情況:
          exp1的情況是:與數據庫同步過或是從數據庫讀取過后,session?關閉,而后又對exp1進行了修改,再從新的session?中將修改與數據庫同步。
          exp2的情況是:本身未與數據庫同步過,但是它所代表的數據在數據庫中存在
          exp3的情況是:本身未與數據庫同步過,但是它所代表的數據在數據庫中不存在


          現在對紅色標出的代碼部分變化時對執行結果的影響進行分析:
          如果是update操作,?這三種情況的結果如下:
          case1:日志中產生一條update語句,并且更新了數據庫中的數據
          case2:日志中產生一條update語句,并且更新了數據庫中的數據
          case3:日志中產生一條update語句,但對數據庫沒有影響,因為根本不存在那個id對應的數據

          ?如果是saveOrUpdate操作,情況則繁瑣一些:
          (1)如果指定id 的generator-class="assigned",
          ??? (1.1)如果指定Id?的 unsaved-value="null"
          ???????????? 則生成三條update語句
          ???(1.2)如果沒有指定Id?的 unsaved-value
          ??????????? 則生成三條insert語句。
          ?? (1.3)如果指定Id?的 unsaved-value="undefined"
          ????????????? case1:日志中產生一條update語句,并且更新了數據庫中的數據
          ????????????? case2:日志中產生一條update語句,并且更新了數據庫中的數據
          ????????????? case3:日志中產生一條insert語句,數據庫中插入了一條數據
          ?????????? 但由于在這種條件下?,是強制Hibernate查詢數據庫以判斷對象到底是暫態(transient )還是只是脫管(detached)的,個人認為這樣可能會導致性能不高,所以對于事前已經知道是transient狀態的對象,直接對其進行save操作就行了。

          (2)其他的generator-class還沒有試過

          結論:Update:是對暫態(transient )或是只是脫管(detached)的更新操作,對于暫態對象的更新操作通常不產生效果,對于脫 管對象是做了同步的操作,即數據庫的數據發生變化并且對象狀態也成為托管對象
          ???????????? SaveOrUpdate : 也是對暫態(transient )或是只是脫管(detached)的進行操作,至于是插入還是更新,則要根據id 中指定的一些具體條件來分析。但是個人認為在明顯只會發生插入操作的情況還是盡量避免用saveOrUpdate而直接用save即可。

          posted on 2006-04-22 23:26 moon 閱讀(4543) 評論(0)  編輯  收藏


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


          網站導航:
           
          主站蜘蛛池模板: 清涧县| 高青县| 株洲县| 昌江| 噶尔县| 龙南县| 黄骅市| 蒲江县| 西城区| 镇赉县| 乐平市| 宁津县| 马尔康县| 大竹县| 彭阳县| 阿坝县| 板桥市| 临桂县| 内黄县| 分宜县| 昆山市| 和静县| 罗田县| 平陆县| 东丽区| 大姚县| 永定县| 盐津县| 宝兴县| 石家庄市| 都兰县| 瑞安市| 河池市| 城固县| 萍乡市| 邻水| 玉溪市| 隆林| 汉沽区| 南汇区| 奉化市|