blog-moon

          導航

          <2025年8月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          統計

          常用鏈接

          留言簿(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 閱讀(4544) 評論(0)  編輯  收藏


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


          網站導航:
           
          主站蜘蛛池模板: 合作市| 江北区| 乾安县| 亚东县| 和田县| 云霄县| 姚安县| 民勤县| 池州市| 定远县| 莱西市| 安化县| 遵义市| 镇安县| 海原县| 礼泉县| 广西| 日喀则市| 苏尼特左旗| 翁源县| 婺源县| 蒙城县| 固镇县| 库车县| 沙坪坝区| 赫章县| 宁安市| 治多县| 台北市| 叙永县| 梁平县| 三门峡市| 阿巴嘎旗| 廉江市| 安丘市| 垫江县| 桐城市| 郸城县| 广安市| 天气| 甘谷县|