【问题标题】:Grails Gorm beforeUpdate behaviour with dynamicUpdate set to true动态更新设置为 true 的 Grails Gorm beforeUpdate 行为
【发布时间】:2020-02-06 14:20:55
【问题描述】:

我正在尝试在 beforeUpdate 事件中更改域对象的属性。问题是更改的属性没有到达数据库。有问题的域类将 dymanicUpdate 设置为 true。我注意到,如果我将 dynamicUpdate 更改为 false,则该属性将持久保存到数据库中。

我使用 GORM 6.0.11 创建了一个简单的 Grails 3.2.9 项目和一个域类。

class Example {

    Integer status
    Date dateCreated
    Date dateClosed
    Date lastUpdated

    static constraints = {
        status nullable: true
        dateClosed nullable: true
    }

    static mapping = {
        dynamicUpdate true
    }

    def beforeUpdate() {
        if (isDirty('status')) {
             dateClosed = new Date();
        }
    }
}

默认情况下,dynamicUpdate 设置为 false,并且我在 beforeUpdate 事件中更改的属性被持久化到数据库中。虽然,如果我将 dynamicUpdate 切换为 true,在 beforeUpdate 事件中更改的属性将不再保留到数据库中。我在 dateCreated 列中得到的不是当前日期。

知道这种行为的原因是什么,以及如何在 dynamicUpdate 设置为 true 的情况下获得相同的结果?

【问题讨论】:

    标签: hibernate grails grails-orm


    【解决方案1】:

    我不确定它是否与 dynamicUpdate 有关,但我最近发现,在 GORM 的 before* 拦截器中,您应该使用 setter 而不是 java bean 表示法。

    所以这个

    def beforeUpdate() {
      dateClosed = new Date()
    }
    

    应该是

    def beforeUpdate() {
      setDateClosed new Date()
    }
    

    这种行为的原因是,如果在同一类中完成,您正在更改的属性未标记为 dirty

    【讨论】:

    • 感谢您的建议。试过了,还是不行。
    猜你喜欢
    • 2011-08-21
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    相关资源
    最近更新 更多