【发布时间】:2013-12-11 14:55:15
【问题描述】:
保存新创建的域对象(在控制器中)会导致休眠会话立即刷新。 (我添加了 sleep() 以确保它不是日志记录问题,并且我使用 mysql-query.log 仔细检查了这些调用,而不仅仅是“打印”)
5.times { i ->
new Foo(bar: "$i").save()
log.error("$i")
sleep(1000)
}
启用休眠查询日志会导致
2013-12-11 15:26:41,593 [http-bio-8080-exec-6] DEBUG hibernate.SQL - insert into foo (version, bar) values (?, ?)
| Error 2013-12-11 15:26:41,596 [http-bio-8080-exec-6] ERROR app.HomeController - 0
2013-12-11 15:26:42,600 [http-bio-8080-exec-6] DEBUG hibernate.SQL - insert into foo (version, bar) values (?, ?)
| Error 2013-12-11 15:26:42,605 [http-bio-8080-exec-6] ERROR app.HomeController - 1
2013-12-11 15:26:43,610 [http-bio-8080-exec-6] DEBUG hibernate.SQL - insert into foo (version, bar) values (?, ?)
| Error 2013-12-11 15:26:43,613 [http-bio-8080-exec-6] ERROR app.HomeController - 2
2013-12-11 15:26:44,618 [http-bio-8080-exec-6] DEBUG hibernate.SQL - insert into foo (version, bar) values (?, ?)
| Error 2013-12-11 15:26:44,622 [http-bio-8080-exec-6] ERROR app.HomeController - 3
2013-12-11 15:26:45,626 [http-bio-8080-exec-6] DEBUG hibernate.SQL - insert into foo (version, bar) values (?, ?)
| Error 2013-12-11 15:26:45,631 [http-bio-8080-exec-6] ERROR app.HomeController - 4
查看 grails 文档 http://grails.org/doc/latest/ref/Domain%20Classes/save.html
save 方法通知持久性上下文应该保存或更新一个实例。除非使用 flush 参数,否则对象不会立即持久化:
我的问题是:文档是错误的还是这是一个错误?
问题(至少对我而言)是整个会话被刷新,这可能导致不需要的更改被持久化。
我在 grails-2.3.3 和 grails-2.2.4 上复制了这个,并检查了最新的 hibernate3 和 hibernate4 插件。所有配置组合的行为都是相同的,所以我想这是一个误导性文档,但我仍然想仔细检查。
更新
按照 sergio 的要求,这个超级简单的控制器会导致上面的输出。
class HomeController {
def index(){
5.times { i ->
new Foo(bar: "$i").save()
log.error("$i")
sleep(1000)
}
}
}
【问题讨论】:
-
你能分享完整的控制器代码吗?
-
什么版本的 Grails?
-
添加了控制器@BurtBeckwith,因为我用 grails-2.3.3 和 grails-2.2.4 以及最新的 hibernate4 和 hibernate3 插件进行了测试。
标签: grails grails-orm