You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 06:06:45