保存新创建的域对象(在控制器中)会导致立即刷新休眠会话。 (我增加了睡眠(),以确保它不是一个记录的问题,我是双的mysql-query.log检查,这些调用制成,不仅有“印刷”)保存新的域对象会导致立即刷新
5.times { i ->
new Foo(bar: "$i").save()
log.error("$i")
sleep(1000)
}
与Hibernate查询日志启用这导致
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
的保存方法通知实例应该被保存或更新的持久化上下文。除非使用flush参数,否则该对象将不会立即保留:
对于我来说,问题是:文档是错误的还是这是一个错误?
问题(至少对我来说)是完整的会话被刷新,这可能会导致不需要的更改持续存在。
我在grails-2.3.3和grails-2.2.4上重现了这一点,并使用最新的hibernate3和hibernate4插件进行了检查。所有配置组合的行为是相同的,所以我想这是一个误导性的文档,但仍然想要仔细检查。
更新
按照要求由塞尔吉奥这个超级简单的控制导致了上面的输出。
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插件测试过。 – peschenbach