Hibernate Session 方法學習筆記

一:flush()

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

二:refresh()

會強置發送SELECT語句從數據庫獲取最新的狀態,以便Session緩存中對象的狀態跟數據表中對應的記錄保持一致。

三:evict()

從session緩存中把指定的持久化對象移除 。

四:save()

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

五:prisist()

也會執行INSERT操作,和save的區別在調用persist方法之前,若對象已經有ID了,則不會執行INSERT,而是拋出一個異常。

六:get() VS load()

1.執行get方法會立即加載對象。而執行load方法,若不適用該對象,則不會立即執行查詢操作而是返回一個代理對象,get是立即檢索,load是延遲檢索。
2.在代理對象之前關閉了Session的話,load方法可能會拋出LazyInitializationException 異常 。
3.若數據表中沒有對應的記錄,且Session也沒有關閉get返回null,load若不使用該對象的任何屬性,則沒問題,若需要初始化了,則拋出異常。

七:update()

1.若更新一個持久化對象,不需要顯示的調用update方法,因爲在調用Transaction的commit()方法時,會先執行session的flush。
2.更新一個遊離對象,請顯示的調用session的update方法,將一個遊離對象轉變爲持久化對象。
3.無論要更新的遊離對象和數據表的記錄是否一致,都會發送update語句
4.如何能讓update方法不在盲目的發出update語句呢?在.hbm,xml文件的class節點設置select-before-update = true(默認爲false),但通常不需要設置該屬性,在與觸發器工作時需要。
5.若數據表中沒有對應的記錄,但還調用了uodate方法,會拋出異常
6.當update()方法關聯一個遊離對象時,如果Session的緩存中已經存在相同OID的持久化對象,會拋出異常,因爲在Session緩存中不能有兩個IOD相同的對象。

八:delete()

執行刪除操作,只要OID和數據表中的一條記錄對應,就會準備執行delete操作, 若OID在數據表中沒有對應的記錄,則會拋出異常,可以通過hibernate配置文件hibernate.use_identifier_rollback爲true,使其刪除對象後,把OID置爲null。

九:

1.若OID不爲null,但數據表中還沒有和其對應的記錄,會拋出一個異常
2.瞭解:OID值等於。hbm.xml內id的unsaved-value屬性值的對象,也被認爲是一個遊離對象

發佈了64 篇原創文章 · 獲贊 42 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章