從我讀到的,save()
通知持久性上下文應該保存或更新實例。但是,我有一個服務中的方法,可以在不調用save()
的情況下更改域實例的屬性,並且該更改立即顯示在我的數據庫中,沒有問題。什麼時候應該在Grails中的域對象的實例上調用save()?
save()
方法只是一種更安全的方法,知道在更改後會更新域實例(並使用failOnError映射捕獲錯誤)?是否每次使用它都會改變域實例的屬性,或者是過度使用它?
從我讀到的,save()
通知持久性上下文應該保存或更新實例。但是,我有一個服務中的方法,可以在不調用save()
的情況下更改域實例的屬性,並且該更改立即顯示在我的數據庫中,沒有問題。什麼時候應該在Grails中的域對象的實例上調用save()?
save()
方法只是一種更安全的方法,知道在更改後會更新域實例(並使用failOnError映射捕獲錯誤)?是否每次使用它都會改變域實例的屬性,或者是過度使用它?
如果您創建了一個域類的新實例,那麼調用將會告訴底層的Hibernate層將新對象保存到數據庫中。沒有.save()
它不會被持久化到數據庫。
如果您通過.get(myId)
檢索對象,則任何更改將自動保留到底層事務結束時的數據庫中,因爲Hibernate將該對象視爲「髒」。事務的結束位於對事務服務的方法調用結束時或控制器請求結束時。如果你想在這些情況下,你可以撥打.save()
,但這不是必要的。它通過.save(flush:true)
或failOnError
用法可以輕鬆訪問沖洗休眠以進行驗證。
我使用.findBy()來檢索對象,但我認爲它與.get具有相同的「保存方法結束」效果。 – Weezle 2012-02-28 22:43:56
是的,持久化發生在任何檢索現有對象的方法上,除非它是像.read()這樣的只讀檢索。 – schmolly159 2012-02-28 22:47:56
利用驗證可能是持久化新實例之外'save()'的最常見用法之一。 – cdeszaq 2012-04-12 15:14:49
數據庫是即時更新還是正在立即更新您的休眠緩存? – doelleri 2012-02-28 22:22:32
我正在使用的MySql數據庫正在更新。 – Weezle 2012-02-28 22:34:54