在我的应用中,我有一个这样的代码:
// 1
Foo.get(123).example = "my example" // as expected, don't change value in db
// 2
Foo.get(123).bars.each { bar ->
bar.value *= -1 // it's changing "value" field in database!! WHY?
}
为什么数据库中的gorm节省是第二种情况? 我在代码中没有任何save()方法。
韩国社交协会
解决:
我需要使用read()
来获取只读会话。
(Foo.discard()也有效)
(在第一种情况下,我想我做了很多)
答案 0 :(得分:2)
两者都应该保存,所以第一个例子似乎是一个bug。 Grails请求在OpenSessionInView拦截器的上下文中运行。这会在每个请求开始时打开一个Hibernate会话,并将其绑定到该线程,并在请求结束时刷新并关闭它。这有助于延迟加载,但可能会产生意想不到的后果,如你所见。
虽然您没有明确保存,但Hibernate刷新中的逻辑涉及查找已修改的所有附加实例并将更新推送到数据库。这是一个性能优化,因为如果每个更改都被推送,它将减慢速度。所以可以等到刷新的所有东西都排队等了。
因此,您需要显式保存的唯一时间是新实例,以及何时需要检查验证错误。