使用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; }
额外注意事项
- 使用包装类型后,在第一个Lambda写入
createdDate时,要确保显式赋值(比如System.currentTimeMillis()),避免存入null。 - 第二个Lambda更新时,只需要设置
lastUpdated和status,createdDate会保持null,从而被DynamoDBMapper跳过,不会覆盖原有值。 - 如果你需要保留基本类型的行为,也可以在更新时先从DynamoDB读取完整记录,再修改需要更新的字段后保存,但这种方式会增加一次读操作,不如包装类型高效。
内容的提问来源于stack exchange,提问作者Conquistador
相关产品推荐
相关产品推荐

