Grails GORM开启dynamicUpdate时beforeUpdate属性不持久化问题咨询
dynamicUpdate=true时beforeUpdate修改属性无法持久化的原因与解决办法
问题原因
当你开启dynamicUpdate=true时,GORM的工作流程是这样的:它会在触发beforeUpdate事件之前就计算好哪些属性是“脏”的(也就是从加载实体到现在被修改过的属性),然后只生成包含这些脏属性的UPDATE语句。
而你在beforeUpdate里修改dateClosed的操作,是在GORM完成脏属性检测之后才发生的,所以这个新修改的字段不会被标记为脏属性,自然不会被包含到UPDATE语句中,也就无法持久化到数据库了。
当dynamicUpdate=false时,GORM会生成包含所有字段的UPDATE语句,不管属性是否被标记为脏,所以即使是beforeUpdate里修改的字段也会被更新到数据库。
解决方案
要在开启dynamicUpdate=true的前提下实现需求,你只需要在修改dateClosed后,手动把它标记为脏属性就行。GORM提供了markDirty()方法来做这件事,修改你的beforeUpdate方法如下:
def beforeUpdate() { if (isDirty('status')) { dateClosed = new Date(); markDirty('dateClosed') // 手动标记该字段为脏属性,让GORM将其纳入更新范围 } }
这样一来,GORM在生成UPDATE语句时就会把dateClosed包含进去,修改后的属性就能正常持久化到数据库了。
内容的提问来源于stack exchange,提问作者Radu-Stefan Zugravu
相关产品推荐
相关产品推荐

