我正在尝试在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来获得相同的结果?

最佳答案

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

所以这

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

应该
def beforeUpdate() {
  setDateClosed new Date()
}

该行为的原因是,如果您在同一类中完成更改,则所更改的属性不会标记为dirty

10-07 23:51