使用DynamoDB增强客户端时Record的updatedAt时间戳未更新问题
DynamoDB增强客户端updatedAt不更新的问题解决
问题根源
1. 注解顺序错误
@DynamoDbUpdateBehavior必须放在@DynamoDbAutoGeneratedTimestampAttribute之前。你当前的注解顺序颠倒,导致增强客户端无法正确识别WRITE_ALWAYS的更新行为配置,所以不会在更新时强制生成新的时间戳。
2. Data Class初始化残留旧值
你的updatedAt默认赋值为createdAt,这会导致从数据库查询出的记录中,updatedAt始终带着旧值。即使配置了WRITE_ALWAYS,错误的注解顺序加上旧值残留,会让自动时间戳扩展跳过更新逻辑。
修正方案
1. 调整实体类的注解顺序和初始化逻辑
@DynamoDbBean data class Record( @get:DynamoDbPartitionKey var uuid: String = UUID.randomUUID().toString(), // 先声明更新行为,再标记自动生成时间戳 @get:DynamoDbUpdateBehavior(UpdateBehavior.WRITE_IF_NOT_EXISTS) @get:DynamoDbAutoGeneratedTimestampAttribute var createdAt: Instant? = null, // 修正注解顺序,移除默认赋值 @get:DynamoDbUpdateBehavior(UpdateBehavior.WRITE_ALWAYS) @get:DynamoDbAutoGeneratedTimestampAttribute var updatedAt: Instant? = null )
2. 使用正确的更新方法
更新记录时,务必使用增强客户端的updateItem方法,而不是putItem。putItem会替换整个记录,如果你的对象携带旧的updatedAt值,会覆盖自动生成的新时间戳:
// 获取表实例 val recordTable = dynamoDbEnhancedClient.table("record-table", TableSchema.fromBean(Record::class.java)) // 查询待更新的记录 val existingRecord = recordTable.getItem(Key.builder().partitionValue(uuid).build()) // 修改业务字段 existingRecord.someField = "updated content" // 执行更新 recordTable.updateItem(existingRecord)
关键说明
AutoGeneratedTimestampRecordExtension的生效逻辑依赖注解顺序:必须先指定更新行为,再标记自动生成时间戳。- 移除
updatedAt的默认赋值,确保对象在创建或更新时,该字段处于可被自动生成逻辑覆盖的状态。 WRITE_ALWAYS配置会强制在每次更新时生成新的时间戳,修正注解顺序后即可触发该逻辑。
内容的提问来源于stack exchange,提问作者Pastafarian
相关产品推荐
相关产品推荐

