Hibernate筆記




flush:使數據庫表中的記錄和Session緩存中的對象保持一致。爲了保持一致,可能會發送對應的SQL語句。
1.在Transaction的commit()方法中:先調用session的flush方法,再提交事務
2.flush()方法可能會發送SQL語句,但不會提交事物。
3.注意
1).執行HQL或QBC查詢,先會進行flush()操作,得到數據表的最新的記錄
2).若記錄的ID是由底層數據庫使用自增的方式生成的,則在調用save()方法後,就會立即發送INSERT語句,應爲save方法後,必須保證對象的ID是存在的。

refresh():會強制發送SELECT語句,使Session緩存中對象的狀態和數據庫表中對應的記錄保持一致!
clear():清理緩存。

-----------------------------------------------------------------------------------------------------

1.save()方法
1).使一個臨時對象變爲持久化對象
2).爲對象分配ID。
3).在flush緩存是會發送一條INSERT語句。
4).在save方法之前的ID是無效的
5).持久化對象的ID是不能被修改的

2.persist():也會執行INSERT操作
和save()的區別:
在調用persist方法之前,若對象已經有ID,則不會執行INSERT,而拋出異常

get VS load:
1.執行get方法:會立即加載對象。
執行load方法,若不適用該對象,則不會立即執行查詢操作,而返回一個代理對象

get是立即檢索,load是延遲檢索
2.load方法可能會拋出lazy異常:在需要初始化代理對象之前已經關閉了Session

3.若數據表中沒有對應的記錄,Session也沒有被關閉。
get返回null
load 若不使用該對象的任何屬性,沒問題;若需要初始化了,拋出異常

update :
1.若更新一個持久化對象,不需要顯示的調用update方法,因爲在調用Transaction的commit()方法時,會先執行session的flush方法
2.更新一個遊離對象,需要顯示的調用session的update方法。可以把一個遊離對象變爲持久化對象

需要注意的:
1.無論需要更新的遊離對象和數據表的記錄是否一致,都會發送UPDATE語句。如何讓update方法不在盲目的發出update語句呢?在。hbm.xml文件的class節點設置select-before-update=true(默認爲false)。但通常不需要設置該屬性。
2.若數據表中沒有對應的記錄,但還調用了update方法,會拋異常
3.當update()方法關聯一個遊離對象時,如果在session緩存中已經存在相同OID的持久化對象,會拋出異常,因爲在session緩存中不能有兩個OID相同的對象

save()方法很顯然是執行保存操作的,如果是對一個新的剛new出來的對象進行保存,自然要使用這個方法了,數據庫中沒有這個對象。
update()如果是對一個已經存在的託管對象進行更新那麼肯定是要使用update()方法了,數據中有這個對象。
saveOrUpdate()這個方法是更新或者插入,有主鍵就執行更新,如果沒有主鍵就執行插入。
 
區別:對於一個從託管狀態到瞬態的對象(對於一個從數據庫中取出來又被刪除的對象),這個對象本身是有主鍵的,但是因爲被刪除了,所以這個時候因爲數據庫中已經沒有了這條記錄了。不過它還有主鍵存在,所以這個時候不可以使用update()或者是saveOrUpdate(),因爲update()方法是認爲數據庫中肯定有這條記錄的,而saveOrUpdate的執行過程就是先查看這個對象是不是有主鍵,有主鍵那麼就執行update()方法,沒有主鍵就執行save()方法,因此結果跟調用了update()方法的效果是一樣的,結果就會出錯,因爲這個對象已經被刪除了,數據庫中已經沒有這條記錄了,只是它還有主鍵而已(僅僅是存在於內存中),因此這個時候要執行的是save()方法。






























發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章