更新帖子:
如果我这样做,在控制器中:
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 中使用手动刷新模式配置也无济于事。
提前致谢!