Grails Gorm beforeUpdate行为,dynamicUpdate设置为true

问题描述 投票:2回答:1

我正在尝试在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 gorm
1个回答
0
投票

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

所以这个

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

应该是

def beforeUpdate() {
  setDateClosed new Date()
}

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

© www.soinside.com 2019 - 2024. All rights reserved.