2010-03-04 29 views
5

我有一個域對象,它根據屬於同一個域對象的參數來保存計算結果。我想確保任何時間參數被用戶更改,它會重新計算並正確保存到數據庫中。在AfterInsert/AfterUpdate中修改對象

我想用afterInsert(爲了確保計算正確的第一個地方)和afterUpdate。

但是,由於我的計算是試圖修改對象本身,它不工作 - 拋出各種休眠異常。

我試圖將afterUpdate代碼放入一個事務中,但這並沒有幫助。恐怕我在這裏陷入循環依賴問題。

現在我得到的例外是:

org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [esc.scorecard.PropertyScorecard#27] 

是專爲簡單的用例的GORM事件?我試圖得出結論,修改你在保存中的對象不是要走的路。

+0

什麼這個問題的解決方法。我也面臨着這個困境。 * .withNewSession *似乎不適用於afterInsert。我無法刷新對象,也沒有保存它(以及我可以.save(),但似乎我在afterInsert中完成的計算不會在數據庫中保留,如果我只是使用.save())。謝謝!無論如何,我只想將一個用戶對象保存在我的域類(例如,消息)中創建它。由於audit-trail只保存一個Long引用(例如,createdby),所以我最終無法操縱Message域的類並最終引用它的屬性 – 2010-06-02 05:57:53

回答

2

是否有任何理由反對使用beforeInsertbeforeUpdate而不是afterInsertafterUpdate

如果不是,切換到before*事件處理程序

+1

在afterInsert觸發時,我認爲對象幾乎是持久的,並且有一個id,但我可能是錯的 - 整個持久化過程(帶有事件)似乎沒有很好的記錄。 – 2010-03-05 09:43:55

+0

事實上,如果您的計算使用'id'屬性,那麼將代碼放入before處理程序可能會有問題。而且我不知道生成id時會觸發哪個事件。 – fabien7474 2010-03-05 13:22:56

3

是否使用1.2.0+應該解決您的問題?

如果你是,你可以在應該避免休眠混亂的事件閉包中使用.withNewSession。

歡呼

+0

是的,我在1.2.1上。我嘗試使用withNewSession,但這並沒有幫助,導致奇怪的休眠錯誤。 – 2010-03-05 09:41:58