posts - 22, comments - 17, trackbacks - 0, articles - 15
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          saveorUpdate與unsaved-value,save,update,delete

          Posted on 2006-12-18 10:40 碼農(nóng)cz 閱讀(510) 評論(0)  編輯  收藏 所屬分類: As u
          希望對剛開始學Hibernate的同學有所幫助

          一、saveorUpdate與unsaved-value
          到底是sava還是update
          Hibernate需要判斷被操作的對象究竟是一個已經(jīng)持久化過的持久對象還是臨時對象。
          1).主鍵Hibernate的id generator產(chǎn)生
          <id name="id" type="java.lang.Long">
          <column name="ID" precision="22" scale="0" />
          <generator class="increment" />
          </id>

          Project project = new Project();
          project.setId(XXX);
          this.projectDao.saveOrUpdate(project);

          1、默認unsaved-value="null"
          主鍵是對象類型,hebernate判斷project的主鍵是否位null,來判斷project是否已被持久化
          是的話,對project對象發(fā)送save(project),
          若自己設置了主鍵則直接生成update的sql,發(fā)送update(project),即便數(shù)據(jù)庫里沒有那條記錄。
          主鍵是基本類型如int/long/double/
          自己設置unsaved-null="0"。
          所以這樣的話save和update操作肯定不會報錯。

          2、unsaved-value="none",
          由于不論主鍵屬性為任何值,都不可能為none,因此Hibernate總是對project對象發(fā)送update(project)

          3、unsaved-value="any"
          由于不論主鍵屬性為任何值,都肯定為any,因此Hibernate總是對project對象發(fā)送save(project),hibernate生成主鍵。

          Hibernate文檔中寫到
          saveOrUpdate()完成了如下工作:
          如果對象已經(jīng)在這個session中持久化過了,什么都不用做
          如果對象沒有標識值,調(diào)用save()來保存它
          如果對象的標識值與unsaved-value中的條件匹配,調(diào)用save()來保存它
          如果對象使用了版本(version或timestamp),那么除非設置unsaved-value="undefined",版本檢查會發(fā)生在標識符檢查之前.
          如果這個session中有另外一個對象具有同樣的標識符,拋出一個異常

          2).主鍵由自己來賦值
          <id name="id" type="java.lang.Long">
          <column name="ID" precision="22" scale="0" />
          <generator class="assigned" />
          </id>

          Project project = new Project();
          project.setId(XXX);
          this.projectDao.saveOrUpdate(project);

          1、默認unsaved-value="null"
          這時有所不同,hibernate會根據(jù)主鍵產(chǎn)生一個select,來判斷此對象是否已被持久化
          已被持久化則update,未被持久化則save。
          2、unsaved-value="none",update對象,同上

          3、unsaved-value="any" ,save對象,
          如果自己自己設置的ID在數(shù)據(jù)庫中已存在,則報錯。

          二、save與update操作
          顯式的使用session.save()或者session.update()操作一個對象的時候,實際上是用不到unsaved-value的
          在同一Session,save沒什么可說得
          update對象時, 最直接的更改一個對象的方法就是load()它,保持Session打開,然后直接修改即可:
          Session s =…
          Project p = (Project) sess.load(Project.class, id) );
          p.setName(“test”);
          s.flush();
          不用調(diào)用s.update(p);hibernate能察覺到它的變化,會自動更新。當然顯示調(diào)用的話也不會錯

          Hibernate文檔中寫到
          update()方法在下列情形下使用:
          程序在前面的session中裝載了對象
          對象被傳遞到UI(界面)層
          對該對象進行了一些修改
          對象被傳遞回業(yè)務層
          應用程序在第二個session中調(diào)用update()保存修改

          三、delete操作
          刪除時直接自己構(gòu)造一個project即可刪除
          this.projectDao.delete(preojct);

          以前刪除我是這樣寫的
          public void deleteProject(String id) {
          Project project = (Project) this.projectDao.get(Project.class, id);
          if (project != null) {
          this.projectDao.delete(project);
          }
          即這樣也是可以的
          Project project = new Project();
          project.setId(id);
          this.projectDao.delete(project).

          如果有級聯(lián)關系,需要把級聯(lián)的子類也構(gòu)造出來add進去,同樣可以刪除。

          好了,羅嗦的夠多了。

          主站蜘蛛池模板: 江永县| 兴文县| 承德县| 新绛县| 龙陵县| 杭州市| 华阴市| 上饶市| 台北县| 临沂市| 双峰县| 黄平县| 双辽市| 苏州市| 泽州县| 临沂市| 湘潭市| 博客| 教育| 康平县| 潮安县| 璧山县| 台中市| 湟中县| 尤溪县| 延寿县| 景洪市| 三门峡市| 安阳县| 太保市| 全椒县| 邮箱| 尼木县| 黔东| 鲁甸县| 兴海县| 抚松县| 万安县| 泸定县| 白银市| 靖安县|