Grails 4 - 为什么域 class 没有被标记为脏?
Grails 4 - why is domain class not being marked as dirty?
投诉:Grails 4.0.10,Gorm 7.0.8.RELEASE 没有在所有情况下设置域 class isDirty 标志,因此没有对后端执行更新。
在 Grails 3 中,多年来我一直在处理令牌登录的过滤器中使用工作代码。成功后执行此代码:
User.withTransaction {
User user = User.get(userDetails.id)
Date now = new Date();
user.loginSuccess(now, userDetails.ipAddr, idno, true)
}
User.loginSucess()方法是这样的:
void loginSuccess(Date when, String ipAddr, String idno = null, boolean flush = false) {
lastLoginDate = loginDate
loginDate = when.toTimestamp()
lastUpdated = when.toTimestamp()
lastLoginIp = loginIp
loginIp = ipAddr
loginFailedCount = 0
firstFailedDate = null
idno = idno
save(flush: flush, validate: false)
}
这段代码永远不会更新数据库,无论刷新标志的状态如何,除非我以某种方式触发 isDirty。我通过改变
来做到这一点
lastUpdated = when.toTimestamp()
到
this.setLastUpdated(when.toTimestamp())
Grails 2 多年前就存在这种设置脏标志的特殊性质。这种不同的行为是预期的还是我的疏忽? (User.lastUpdated 属性 没什么特别的 - 映射为 sqlType 的日期字段:'Timestamp' 用于写入 Postgres。)
以JSB的评论作为对行为的解释,以及答案。
投诉:Grails 4.0.10,Gorm 7.0.8.RELEASE 没有在所有情况下设置域 class isDirty 标志,因此没有对后端执行更新。
在 Grails 3 中,多年来我一直在处理令牌登录的过滤器中使用工作代码。成功后执行此代码:
User.withTransaction {
User user = User.get(userDetails.id)
Date now = new Date();
user.loginSuccess(now, userDetails.ipAddr, idno, true)
}
User.loginSucess()方法是这样的:
void loginSuccess(Date when, String ipAddr, String idno = null, boolean flush = false) {
lastLoginDate = loginDate
loginDate = when.toTimestamp()
lastUpdated = when.toTimestamp()
lastLoginIp = loginIp
loginIp = ipAddr
loginFailedCount = 0
firstFailedDate = null
idno = idno
save(flush: flush, validate: false)
}
这段代码永远不会更新数据库,无论刷新标志的状态如何,除非我以某种方式触发 isDirty。我通过改变
来做到这一点lastUpdated = when.toTimestamp()
到
this.setLastUpdated(when.toTimestamp())
Grails 2 多年前就存在这种设置脏标志的特殊性质。这种不同的行为是预期的还是我的疏忽? (User.lastUpdated 属性 没什么特别的 - 映射为 sqlType 的日期字段:'Timestamp' 用于写入 Postgres。)
以JSB的评论作为对行为的解释,以及答案。