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

使用DynamoDB Mapper更新长整型属性时遇值被重置为0的问题

问题根源

你遇到的问题是Java基本类型的默认值特性导致的:

  • 对于String类型的status,未赋值时默认是null,符合UPDATE_SKIP_NULL_ATTRIBUTES的跳过逻辑,所以不会覆盖原有值。
  • 对于long这种基本数值类型,未赋值时默认值是0,DynamoDBMapper会把0当作一个有效的属性值,而非“未设置”,因此执行save操作时会将createdDate和lastUpdated更新为0,覆盖了原有值。
解决方案

把POJO中的基本类型long替换为对应的包装类型Long,这样未赋值时默认值是null,就能被UPDATE_SKIP_NULL_ATTRIBUTES正确跳过:

修改后的POJO代码:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder(toBuilder = true)
@DynamoDBTable(tableName = "OrderShipment")
public class Order {
    @DynamoDBHashKey(attributeName = "id")
    @NonNull
    public String id;
    @DynamoDBRangeKey(attributeName = "sortKey")
    @NonNull
    public String sortKey;
    @DynamoDBAttribute(attributeName = "createdDate")
    public Long createdDate; // 改为包装类型Long
    @DynamoDBAttribute(attributeName = "lastUpdated")
    public Long lastUpdated; // 改为包装类型Long
    @DynamoDBAttribute(attributeName = "status")
    public String status;
}
额外注意事项
  1. 使用包装类型后,在第一个Lambda写入createdDate时,要确保显式赋值(比如System.currentTimeMillis()),避免存入null。
  2. 第二个Lambda更新时,只需要设置lastUpdated和status,createdDate会保持null,从而被DynamoDBMapper跳过,不会覆盖原有值。
  3. 如果你需要保留基本类型的行为,也可以在更新时先从DynamoDB读取完整记录,再修改需要更新的字段后保存,但这种方式会增加一次读操作,不如包装类型高效。

内容的提问来源于stack exchange,提问作者Conquistador

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 01:57:47