2014-10-01 20 views
0

我的代碼運行良好,但不應該根據我對Hibernate的瞭解。休眠更新,而不是在保存後拋出預期的錯誤

我進行保存對象的操作如下:

IProfile profile = profileManager.getById(profileDtoModifyForm.getId()); 


    profile.setName(profileDtoModifyForm.getName()); 
    profile.setDescription(profileDtoModifyForm.getDescription()); 

    profileManager.save(profile); 

profileManager.getById()方法使用org.Hibernate.Session.get()方法來獲取對象

profileManager.save()梅索德使用org.Hibernate.Session.save() 但我期待一個錯誤因爲該對象已存儲在數據庫中並具有一個id。

代替,休眠執行更新:

Hibernate: update profile set description=?, name=? where id=? 

然後我不明白保存和saveOrUpdate方法之間的區別...

afters關於一些期試驗研究,我發現了很多的描述。一個說,如果ID存在休眠執行更新後,對方稱它應該拋出一個錯誤...

PS:我使用Spring,如果它改變了什麼...

+0

profileManager是什麼? – Chaitanya 2014-10-01 10:35:10

+0

哼,對不起,這是一個服務,只是調用** profileManager.save()** ** org.hibernate.Session.save()** – minioim 2014-10-01 10:44:06

+0

如果對象已經是hibernate管理的實例,則save不會執行任何操作。您正在修改託管實例,因此只要方法結​​束(並且我假設您已設置事務),該方法將對事務執行提交,並且更新(是更新)將刷新並提交到數據庫。你可以刪除保存,它仍然會這樣做。 – 2014-10-01 10:44:29

回答

1

如果你看一看的javadocSession.save方法你會看到它談論瞬態實例。這意味着非Hibernate管理實體。當您正在執行Session.getById以檢索對象時,它是一個-瞬態實例。

如果您使用瞬態實例,它確實會引發異常,指出具有給定標識符的對象已經存在。但是,因爲這已經是一個託管實例,所以這被檢測到,而不是保存更新。

要測試此操作,只需創建要保存的配置文件的新實例,爲其提供一個已存在於數據庫中的ID並嘗試存儲它。

在另一個注意事項上,因爲它已經是一個管理實例,所以您甚至不需要調用save以使更改保持不變,這些更改將自動與數據庫同步。

savesaveOrUpdate之間的主要區別在於返回類型。當使用save時,返回新創建的ID saveOrUpdate返回voidupdate的返回值相同)。但除此之外,無論使用save,update還是saveOrUpate,用於將對象存儲在數據庫中的內部代碼都是相同的。

+0

確實,這對我來說仍然有點棘手。現在我對瞬態和持久狀態很好 但是,嘗試保存已使用ID的新配置文件不會導致錯誤。 但這可能是因爲我設置了一個自動生成的ID戰略嗡嗡聲? – minioim 2014-10-01 11:39:07