请求结束时,GORM自动刷新而不调用save

Ath*_*lan 2 grails hibernate grails-orm

我准备了简单的控制器操作来测试与数据库的意外提交更改相关的行为:

def testSimple() {
    Product p = Product.findById(1);

    p.name = "test doneee"

    //p.save flush:true

    respond p
}
Run Code Online (Sandbox Code Playgroud)

即使save()尚未调用,更改仍保留在数据库中.如何避免保存实体而不打电话save()

Bur*_*ith 7

Grails注册一个OpenSessionInView拦截器,它启动一个Hibernate会话和每个请求的开始,并在请求结束时刷新并关闭它.这主要是为了允许延迟加载的一对多实例和多对一集合按需加载.您所看到的一个副作用是,即使没有save()调用,更改持久性实例也会导致更改被推送到数据库.这是因为更改它会将其标记为脏,并且Hibernate会在刷新期间发现所有脏对象并将更改推送到数据库.

为避免此类更改被持久化,请使用http://grails.org/doc/latest/ref/Domain%20Classes/discard.html方法将其与会话分离.

ps不相关,但你应该使用get而不是findById,因为get同样的事情,但有更好的缓存行为.