【问题标题】:why read-only access is writing to my db, in GORM?为什么只读访问在 GORM 中写入我的数据库?
【发布时间】:2011-09-30 22:57:19
【问题描述】:

在我的应用中,我有这样的代码:

// 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?
}
  • 注意:Foo 和 Bar 是我的数据库中的表

为什么gorm保存在数据库中是第二种情况? 我在代码中没有任何 save() 方法。

Tks


已解决: 我需要使用read() 来获得只读会话。 (Foo.discard() 也可以)

文档:http://grails.org/doc/latest/guide/5.%20Object%20Relational%20Mapping%20%28GORM%29.html#5.1.1%20Basic%20CRUD

(在第一种情况下,我猜我做错了)

【问题讨论】:

    标签: grails grails-orm


    【解决方案1】:

    两者都应该保存,所以第一个示例似乎是一个错误。 Grails 请求在 OpenSessionInView 拦截器的上下文中运行。这会在每个请求开始时打开一个 Hibernate 会话并将其绑定到线程,并在请求结束时刷新并关闭它。这对延迟加载有很大帮助,但可能会产生如您所见的意外后果。

    虽然您没有显式保存,但 Hibernate 刷新中的逻辑涉及查找所有已修改的附加实例并将更新推送到数据库。这是一种性能优化,因为如果每个更改都被推送,它会减慢速度。所以所有可以等到刷新的东西都会排队。

    因此,您需要明确保存的唯一时间是新实例,以及您想要检查验证错误时。

    【讨论】:

    • 谢谢!现在阅读文档并修复我的代码以使用read(),而不是get()
    • 澄清一下,read() 与只读会话无关,它只是禁用该实例的自动刷新。您仍然可以对其进行编辑并调用save(),它会更新,但不会刷新未保存的已修改实例。
    猜你喜欢
    • 2021-04-12
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    相关资源
    最近更新 更多