J2EE學習筆記
          我們的失落……
          posts - 13,comments - 1,trackbacks - 0

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

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

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

          一、saveorUpdate與unsaved-value
          到底是sava還是update
          Hibernate需要判斷被操作的對象究竟是一個已經持久化過的持久對象還是臨時對象。
          1).主鍵Hibernate的id generator產生
          <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對象發送save(project),
          若自己設置了主鍵則直接生成update的sql,發送update(project),即便數據庫里沒有那條記錄。
          主鍵是基本類型如int/long/double/
          自己設置unsaved-null="0"。
          所以這樣的話save和update操作肯定不會報錯。

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

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

          Hibernate文檔中寫到
          saveOrUpdate()完成了如下工作:
          如果對象已經在這個session中持久化過了,什么都不用做
          如果對象沒有標識值,調用save()來保存它
          如果對象的標識值與unsaved-value中的條件匹配,調用save()來保存它
          如果對象使用了版本(version或timestamp),那么除非設置unsaved-value="undefined",版本檢查會發生在標識符檢查之前.
          如果這個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會根據主鍵產生一個select,來判斷此對象是否已被持久化
          已被持久化則update,未被持久化則save。
          2、unsaved-value="none",update對象,同上

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

          二、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();
          不用調用s.update(p);hibernate能察覺到它的變化,會自動更新。當然顯示調用的話也不會錯

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

          三、delete操作
          刪除時直接自己構造一個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).

          如果有級聯關系,需要把級聯的子類也構造出來add進去,同樣可以刪除。

          好了,羅嗦的夠多了。

          posted on 2009-08-27 14:44 J2EE學習筆記 閱讀(495) 評論(0)  編輯  收藏 所屬分類: 轉載hibernate
          主站蜘蛛池模板: 天峨县| 南华县| 耒阳市| 新丰县| 紫云| 永丰县| 宁河县| 四平市| 华容县| 临沂市| 淮滨县| 金溪县| 老河口市| 连江县| 大庆市| 昔阳县| 大姚县| 寻乌县| 泰顺县| 广河县| 宣城市| 定边县| 桐乡市| 凌云县| 牙克石市| 惠东县| 阜康市| 高邮市| 保康县| 贵德县| 高阳县| 梅河口市| 玉林市| 碌曲县| 峨山| 巴林左旗| 游戏| 安塞县| 中西区| 雷山县| 封丘县|