saveorUpdate與unsaved-value,save,update,delete
Posted on 2006-12-18 10:40 碼農cz 閱讀(507) 評論(0) 編輯 收藏 所屬分類: As u
一、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進去,同樣可以刪除。
好了,羅嗦的夠多了。