<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    saveorUpdate與unsaved-value,save,update,delete

    Posted on 2006-12-18 10:40 碼農cz 閱讀(510) 評論(0)  編輯  收藏 所屬分類: As u
    希望對剛開始學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進去,同樣可以刪除。

    好了,羅嗦的夠多了。

    主站蜘蛛池模板: 亚洲一级片免费看| 国产精品成人免费综合| 国产亚洲AV无码AV男人的天堂 | 国产成人3p视频免费观看| 亚洲妓女综合网99| **真实毛片免费观看| 亚洲精品白色在线发布| 国内精自视频品线六区免费| 亚洲黄色三级网站| 午夜福利不卡片在线播放免费| 亚洲熟妇av一区| 67194成是人免费无码| 精品剧情v国产在免费线观看| 亚洲AV成人影视在线观看| 毛片免费观看视频| 国产成人综合久久精品免费| 麻豆安全免费网址入口| 日韩精品亚洲aⅴ在线影院| 一个人看的www免费视频在线观看| 亚洲电影国产一区| 免费人成大片在线观看播放| 国产亚洲精品免费视频播放 | 成人婷婷网色偷偷亚洲男人的天堂| 日本免费一区二区三区最新| ssswww日本免费网站片| 久久亚洲国产精品| 色se01短视频永久免费| 黄网站在线播放视频免费观看| 亚洲毛片αv无线播放一区| 国产成人精品免费视频大全麻豆| 国产精品亚洲精品| 免费少妇a级毛片人成网| 黄网站色视频免费在线观看的a站最新| 久久久久亚洲AV无码麻豆| 女人张开腿等男人桶免费视频| 久久精品夜色国产亚洲av| 午夜国产精品免费观看| 在线播放国产不卡免费视频| 亚洲精品线在线观看| 一个人看的www免费视频在线观看 一个人免费视频观看在线www | 免费一级毛片正在播放|