Grails GORM自动更新问题

时间:2012-07-18 16:40:30

标签: 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 = {}
}

我也有服务测试。测试服务:

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()
  • ,否则不会持久存储到db

反而会发生什么:

  • 在服务调用之后,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中使用手动刷新模式配置也无济于事。

提前致谢!

1 个答案:

答案 0 :(得分:0)

我不确定你链接到的那个帖子是什么让你觉得它会起作用。他们都表示不会工作,创建的门票已关闭,因为无法解决。这里的解决方案是使用discard()作为线程说明。