我出现了一个我不明白的问题。以下代码不起作用:
AccountingEntity accountingEntity = AccountingEntity.get(params.id);
accountingEntity.setLifecycleStatusToArchived();
accountingEntity.save(flush:true);
setLivecylceStatusToArchived方法如下所示:
void setLifecycleStatusToArchived() {
this.lifecycleStatus = AccountingEntity.LIFECYCLE_ARCHIVED; //predefined static variable
this.considerForRankingJob = false;
this.dateArchived = new Date();
}
问题是,实体未更新。 我提前使用accountingEntity.validate()时没有验证错误。
但是,此代码有效:
AccountingEntity accountingEntity = AccountingEntity.get(params.id);
accountingEntity.setDateArchived(new Date());
accountingEntity.setConsiderForRankingJob(false);
accountingEntity.setLifecycleStatus(AccountingEntity.LIFECYCLE_ARCHIVED);
accountingEntity.save(flush:true);
从Grails 3.2.9更新到3.3.0.RC1(Gorm 6.1.5)后,代码不再起作用,除非我按照指南中的所有步骤(http://docs.grails.org/3.3.x/guide/upgrading.html)和其余的代码工作正常(也是数据库访问等)
有人有想法吗?问题可能是什么?
提前致谢和最诚挚的问候!
答案 0 :(得分:2)
简短的回答是脏检查。当你在实例方法中设置属性时,Grails并不知道它们是脏的。
有关如何解决问题,请参阅以下github问题:
https://github.com/grails/grails-data-mapping/issues/961
你有两个选择:
每次更改内部字段时,都会调用markDirty
。这将会 更好的性能或按照 http://gorm.grails.org/latest/hibernate/manual/index.html#upgradeNotes 使用hibernateDirtyChecking: true