<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進去,同樣可以刪除。

    好了,羅嗦的夠多了。

    主站蜘蛛池模板: 亚洲中文字幕在线观看| 亚洲一卡二卡三卡四卡无卡麻豆| 老司机亚洲精品影视www| 亚洲AV永久无码精品一百度影院| 亚洲av片不卡无码久久| 人与禽交免费网站视频| 亚洲国产av一区二区三区| 亚洲第一页在线观看| 婷婷亚洲综合五月天小说在线| 国产一级一毛免费黄片| 午夜老司机免费视频| 久久综合亚洲色HEZYO社区| 一区二区三区视频免费| 午夜一级毛片免费视频| 亚洲综合一区二区精品久久| 日本XXX黄区免费看| 99久久亚洲精品无码毛片| 一级毛片免费不卡直观看| 拨牐拨牐x8免费| 久久精品国产亚洲AV无码偷窥| 24小时日本韩国高清免费| 亚洲人成网77777亚洲色| 香蕉视频在线观看免费| 成年丰满熟妇午夜免费视频| 国产精品亚洲专区无码唯爱网| 亚洲国产人成精品| 国产成人亚洲精品蜜芽影院| 91在线视频免费91| 亚洲欧洲尹人香蕉综合| 97在线视频免费公开观看| 亚洲产国偷V产偷V自拍色戒| 国产区图片区小说区亚洲区| 亚洲五月综合缴情在线观看| 84pao强力永久免费高清 | 日本不卡免费新一二三区| 久久精品国产亚洲av麻豆色欲| 在线观看的免费网站| 一级毛片免费不卡直观看| 亚洲国产精品成人精品小说| 亚洲五月午夜免费在线视频| 精品国产免费一区二区三区|