Session方法

Session的save()和persist()方法
Session的save()方法使一個臨時對象轉變爲持久化對象。它完成如下操做:
(1)將臨時對象加入到Session緩存中,使其進入持久化狀態。
(2)選用映射文件指定的標識符生成器,爲持久化對象分配惟一的OID。
(3)計劃執行一個insert語句。  
Session的save()方法是用來持久化臨時對象的。不該將持久化對象或遊離對象傳遞給save()方法。
若將持久化對象傳遞給save()方法,則該步保存操做是多餘的。
若將遊離對象傳遞給save()方法,則會從新生成OID,再保存一次。

Session的persist()方法與save()方法相似,也能將臨時對象轉變爲持久化對象。
persist()方法與save()方法的區別在於:
persist()方法不保證當即爲持久化對象的OID賦值,而是有可能在Session清理緩存的時候才爲OID賦值。
此外,若是是在事物邊界之外調用persist()方法,則該方法不會計劃執行insert語句。而save()方法不管是在事物邊界之外仍是之內,都會計劃執行insert語句。

Session的load()與get()方法
Session的load()與get()方法都能從根據給定的OID從數據庫中加載一個持久化對象,這兩個方法的區別在於:
(1)當數據庫中不存在與OID對應的記錄時,load()方法拋出org.hibernate.ObjectNotFoundException異常,而get()方法返回爲null。
(2)load方法採用配置的加載策略(默認爲延遲加載),而get()方法則會忽略配置,老是採用當即加載方法。

Session的update()方法
Session的update()方法使一個遊離對象轉變爲持久化對象。它完成如下操做:
(1)將遊離對象加入到Session緩存中,使其轉變爲持久化對象。
(2)計劃執行一個update語句。
當update()方法關聯一個遊離對象時,若在Session的緩存中已存在相同的OID的對象時,會拋出異常。

疑問:若是數據庫總沒有對應的記錄,會產生異常? update語句若是沒有記錄更新是不會報錯的呀?


Session的saveOrUpdate()方法
Session的saveOrUpdate()方法同時包含了save()方法與update()方法的功能,若是傳入的參數是臨時對象,就調用save()方法;若是傳入的參數是遊離對象,就調用update()方法。HIbernate根據對象的OID,version版本屬性等來判斷參數是臨時對象仍是遊離對象。

Session的merge()方法
Session的merge()方法可以將一個遊離對象的屬性複製到一個持久化對象中。其處理流程以下:
(1)根據遊離對象的OID到Session緩存中查找匹配的持久化對象。若找到匹配的持久化對象,則將遊離對象的屬性複製到持久化對象中,計劃實行一條update語句,而後返回持久化對象的引用。
(2)若是在Session的緩存中沒有找到與遊離對象OID一致的持久化對象,那麼就試圖根據該OID從數據庫中加載持久化對象。若是數據庫中存在匹配的持久化對象,則將遊離對象的屬性複製到剛加載的持久化對象中,計劃實行一條update語句,而後返回持久化對象的引用。
(3)若是數據庫中也不存在or對象是臨時對象時,則會新建一個對象,將屬性賦值到該新建對象中,再持久化新建對象,最後返回新建對象的引用。

merger()和saveOrUpdate()的區別:

調用完meger()對象仍然是脫管狀態。


Session的delete()方法
Session的delete()方法用於從數據庫中刪除一個Java對象。delete()方法既能夠刪除持久化對象,也能夠刪除遊離對象。其處理過程以下:
(1)若是傳入的參數是遊離對象,則先使遊離對象與Session關聯,使它變爲持久化對象。若是參數是持久化對象,則忽略該步。
(2)計劃執行一個delete語句。
(3)把對象從Session緩存中刪除,該對象進入刪除狀態。

Session的replicate()方法
Session的replicate()方法可以將一個數據庫中的對象複製到另外一個數據庫中。數據庫

相關文章
相關標籤/搜索