J2EE學(xué)習(xí)筆記
          我們的失落……
          posts - 13,comments - 1,trackbacks - 0

          這些操作對經(jīng)常使用hibernate的同學(xué)已經(jīng)很熟悉了,我也經(jīng)常用但一些細節(jié)并不了解,
          最近遇到問題才開始有看了一下。

          在讀完robbin的這兩個精華貼的時候,感覺清晰了很多,確實好文章。
          http://www.javaeye.com/topic/2712
          http://www.javaeye.com/topic/1604?page=1
          還有這個精華貼
          http://www.javaeye.com/topic/7484
          也很不錯。

          里面總結(jié)的很好了,我結(jié)合以上三個帖子、自己的試驗(版本hibernate-3.0.5)和Hibernate文檔也總結(jié)了一點,加深理解。希望對剛開始學(xué)Hibernate的同學(xué)有所幫助。

          一、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),
          若自己設(shè)置了主鍵則直接生成update的sql,發(fā)送update(project),即便數(shù)據(jù)庫里沒有那條記錄。
          主鍵是基本類型如int/long/double/
          自己設(shè)置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),那么除非設(shè)置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對象,
          如果自己自己設(shè)置的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è)務(wù)層
          應(yīng)用程序在第二個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)關(guān)系,需要把級聯(lián)的子類也構(gòu)造出來add進去,同樣可以刪除。

          好了,羅嗦的夠多了。

          posted on 2009-08-27 14:44 J2EE學(xué)習(xí)筆記 閱讀(502) 評論(0)  編輯  收藏 所屬分類: 轉(zhuǎn)載 、hibernate
          主站蜘蛛池模板: 仙居县| 上饶市| 正镶白旗| 石渠县| 松溪县| 安丘市| 天水市| 阿尔山市| 玉林市| 金沙县| 桃园市| 乌什县| 锦州市| 苏尼特右旗| 大新县| 临武县| 阳山县| 盐源县| 德安县| 崇仁县| 内丘县| 金沙县| 南靖县| 枣强县| 江津市| 胶州市| 维西| 宜丰县| 瓦房店市| 江安县| 山阴县| 萍乡市| 渭源县| 杨浦区| 新建县| 河池市| 弥勒县| 乌鲁木齐市| 沂水县| 平远县| 德保县|