在我的应用程序中,我有这样的代码:
// 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() 方法。
Tks
已解决:
我需要使用
read()
获得只读 session 。(Foo.discard() 也有效)
文件:http://grails.org/doc/latest/guide/5.%20Object%20Relational%20Mapping%20%28GORM%29.html#5.1.1%20Basic%20CRUD
(在第一种情况下,我想我做了错误测试)
最佳答案
两者都应该保存,所以第一个例子似乎是一个错误。 Grails 请求在 OpenSessionInView 拦截器的上下文中运行。这会在每个请求开始时打开一个 Hibernate session 并将其绑定(bind)到线程,并在请求结束时刷新并关闭它。这对延迟加载有很大帮助,但可能会产生意想不到的后果,就像您看到的那样。
尽管您没有显式保存,但 Hibernate 刷新中的逻辑涉及查找所有已修改的附加实例并将更新推送到数据库。这是一种性能优化,因为如果每个更改都被推送,它会减慢速度。所以所有可以等到刷新的东西都排队了。
因此,您唯一需要显式保存的时间是针对新实例,以及当您想要检查验证错误时。
关于grails - 为什么只读访问在 GORM 中写入我的数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7616874/