2013-07-12 88 views
20

通常,我已經讀到save()方法產生用於對象和只火INSERT新的標識符,並保存它,它不更新它,而saveOrUpdate()方法的方法可INSERT更新記錄。差異保存和saveOrUpdate方法冬眠

但按我的經驗,在這裏我可以解釋了示例代碼更好,

假設有A類,我發現記錄從表A通過

A a = getHibernateTemplate.findById(7); 

所以現在我得到一個持久對象,

現在我試圖用保存方法保存記錄,只需修改一些字段,

現在我射擊,

getHibernateTemplate.save(a); 

所以它只是更新現有記錄,但按我的知識應該創造新的紀錄

我可能是錯誤的關於certian的東西,有人可以清楚這一點?

+4

@GokcenG我正在執行一個簡單的谷歌搜索,來到這個答案。或者你是否說我們應該進行重構以從itnernets中刪除重複信息?另外,因爲這是我在google上看到的第一個答案,如果其中5個令人討厭的mod類型沒有將其標記爲重複,它會非常好 - 它顯然獲得了最有用/最準確的問題名稱,至少對於搜索而言用過的。這不值得嗎? –

回答

23

保存

保存method店的object到數據庫中。它將持續給定的瞬態實例,首先分配一個生成的標識符。 它returnsid創建的實體。

然而,

saveOrUpdate()方法

呼叫任一標識符的基礎上存在與否上save()update()。例如,如果存在標識符,update()將被調用,否則save()將被調用。

還有很多像persist(),merge(),saveOrUpdateCopy()。幾乎所有的功能和可用性都略有不同。

欲瞭解更多,你可以閱讀。 What are the differences between the different saving methods in Hibernate?

+2

我想你的答案中有錯字錯誤。請糾正它。 你的回答說:「如果標識符存在,save()將被調用,否則將調用update()。」它應該是「如果標識符存在,update()將被調用,否則save()將被調用。」 –

9

所述的org.hibernate.Session類方法之間的重要區別,保存& saveOrUpdate是,save生成一個INSERT查詢一個新的標識符和的結果,而saveOrUpdate確實一個INSERT或UPDATE。

節省

保存方法存儲的對象到數據庫中。這意味着如果標識符不存在,它會插入一個條目,否則會引發錯誤。如果主鍵已存在於表中,則無法插入。

saveOrUpdate

此方法調用保存()或更新()的基礎上操作。如果標識符存在,它將調用update方法,否則將調用save方法。 saveOrUpdate()方法方法執行以下操作:

如果對象是在當前會話中已經持久的,它什麼都不做 如果與會話相關的另一個對象具有相同的標識符,拋出一個異常給調用者 如果對象沒有標識屬性,保存()對象 如果對象的標識都分配一個新實例化對象的值,保存()對象

更從here閱讀。

2

save()應該將臨時實例作爲參數,而不是持久實例。 javadoc並不是很詳盡,但AFAIK在持久化實例上調用save()沒有任何作用,除了將操作級聯到連接到實體的瞬態實例之外,就是配置了這樣一個級聯。

請注意,通常沒有理由在附加的持久實體上調用save()saveOrUpdate(),因爲Hibernate會對實體進行髒檢查並自動保留更改。

0

所以它只是更新現有的記錄,但據我所知,它應該創建新的記錄:是的,它應該創建一個新的記錄。但是,這種行爲僅適​​用於不適用於持久對象的瞬態對象。

通過調用load加載對象的那一刻,此對象與會話(持久狀態)相關聯。由於髒檢查,這個對象無論如何都會在刷新過程中更新。但是,如果這個對象是一個新的對象,它實際上在調用save()或saveoOrUpdate()api方面有所不同。