我正在尝试在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
。