grails - 为什么只读访问在 GORM 中写入我的数据库?

标签 grails grails-orm

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

// 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()获得只读 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/

    相关文章:

    grails - Grails 中没有双向关系的级联删除

    更新 : Validation error whilst flushing entity on AbstractPersistenceEventListener 上的 ValidationException

    Grails 1.3.4 缺少依赖问题

    grails - 在 hasMany 关系中创建条件 Grails

    grails - grails-afterDelete()访问域属性

    java - 现代 HTML/CSS/JS 布局以及 Java 后端

    grails - 尝试使组具有在Grails中拥有自己的URL的能力。 (类似于您如何浏览至facebook.com/{username})

    grails - 断言页面时出现Geb 'at null'

    grails - 如何增加内存并修复 Grails 中的 "GC overhead limit exceeded"错误?

    grails - 建立一对多对一的关系