2012-07-18 58 views
1

更新的帖子:的Grails GORM自動更新問題

在控制器如果我這樣做:

 def obj = new Test(name:"lol") 
    obj.save(flush:true) 
    obj.name = "lol2" 

    //a singleton service with nothing to do with obj 
    testService.dostuff() 
    /* 
     "obj" gets persisted to the database right here 
     even before the next println 
    */ 
    println "done" 

誰能請解釋我爲什麼會這樣使用Grails 1.3.7,而不是使用Grails 2?是什麼原因?

我知道我可以使用discard(),基本上重構代碼,但我對後臺發生的事情和原因感興趣。謝謝!

舊文章:

我有一個測試Grails應用程序。我有一個域類test.Test:

package test 

class Test { 
    String name 
    static constraints = {} 
} 

另外我有一個服務test.TestService:

package test 

class TestService { 

    static scope = "singleton" 
    static transactional = true 

    def dostuff() { 
     println "test service was called" 
    } 
} 

和一個控制器test.TestController:

package test 

class TestController { 

    def testService  

    def index = { 
    def obj = new Test(name:"lol") 
    obj.save(flush:true) 
    obj.name = "lol2" 
    testService.dostuff() 
    println "done" 
    } 
} 

所以我做什麼:

  • 創建域對象
  • 更改它的一個特性
  • 調用單服務方法

我會期待什麼:

  • 沒有被保存到)數據庫,除非我打電話obj.save(

取而代之的是:

  • 服務調用之後Grails將對數據庫執行更新查詢。

我曾嘗試以下配置從這個網址:http://grails.1312388.n4.nabble.com/Turn-off-autosave-in-gorm-td1378113.html

hibernate.flush.mode="manual" 

但它並沒有幫助。

我用Grails 1.3.7測試過它,Grails 2.0.3沒有這個問題。

任何人都可以請給我一些關於究竟發生了什麼的更多信息嗎?看起來當前會話必須由於服務調用而被終止,並且由於對象是髒的,它在服務調用之後會自動保持到數據庫。我不明白,即使在Hibernate中手動刷新模式配置也沒有幫助。

在此先感謝!

+0

@Gregg - 在save()調用之後和更改任何內容之前調用discard()。您應該在別人之前將您的評論轉換爲答案:) – 2012-07-18 20:06:29

+0

@BurtBeckwith我已更新該帖子,可否請您看看?謝謝! – Aston 2012-07-19 11:09:13

回答

0

我不確定你鏈接到的那個線程是什麼讓你覺得它會起作用。他們都表示它不會工作,創建的票據已經關閉,因爲無法修復。這裏的解決方案是使用discard()作爲線程聲明。

+0

的確,我確實只是在任何人將我指向該頁面之前添加了評論。我真正的問題是在服務調用之後立即執行保存,我不能使用discard()。 – Aston 2012-07-19 08:37:02

+0

我會更新問題以使其更有意義。 – Aston 2012-07-19 08:38:59