2017-03-13 28 views
0

我遷移到Grails的3.1.15(休眠4),發現我的一些控制器動作不工作了。對象不堅持,沒有從Grails的2.4.5(休眠3)錯誤

我有以下行爲(簡體)

def create() { 
     def myDomainObject = myDomainservice.getDefault() 
     if (myDomainObject.validate()) { 
      myDomainObject.save() 
      render 'OK' 
     } else { 
      render 'WRONG' 
     } 
} 

這個動作的Grails 2.工作得很好,當確認沒有返回錯誤的對象被創建。

在Grails的3然而,這是不正確的了。該動作調用沒有錯誤地執行,但該對象不存儲在數據庫中(然而,分配了ID)。

經過一些故障排除後,我得出結論,稱validate()忽略save()(validate()沒有檢測到任何問題)。

添加@Transactional或明確沖洗save(flush:true)解決了這個問題。

我能夠恢復舊的行爲嗎?

我檢查了hibernate.flush.mode = AUTO和它的兩個版本是相同的。

+0

因爲您的控制器操作不是事務性的。嘗試移動它的服務或添加MyObject.withTransaction {//做些事情}。我必須說,這似乎是所有的倒退,因爲你正在調用服務來獲取東西,然後保存在控制器哈哈滑稽 – Vahid

回答

0

核心應用程序邏輯(如結構域保存)在控制器通過Grails的團隊至少由於不潔separation of conserns氣餒。

嘗試你的邏輯移到服務(它們是由默認的事務,即與@Transactional被註釋),你支付一次2個球:

  1. 清潔代碼
  2. 工作功能