我来自关系数据库背景,我们有一种方法可以填充时间戳以进行行创建和更新。我很难找到 DynamoDB 的类似功能。
我检查了 DynamoDB,以检查它们是否支持自动填充 dynamoDB 中每个条目的日期时间戳。我看到可以创建随机ID,但这不是我需要的。
我的使用案例是在向 DynamoDB 表添加任何条目时自动添加时间戳条目。感谢任何指示。谢谢
使用注释的 Java 解决方案(数据建模包(
您可以使用DynamoDBAutoGeneratedTimestamp
批注。
@DynamoDBAutoGeneratedTimestamp(strategy=DynamoDBAutoGenerateStrategy.CREATE)
public Date getCreatedDate() { return createdDate; }
public void setCreatedDate(Date createdDate) { this.createdDate = createdDate; }
@DynamoDBAutoGeneratedTimestamp(strategy=DynamoDBAutoGenerateStrategy.ALWAYS)
public Date getLastUpdatedDate() { return lastUpdatedDate; }
public void setLastUpdatedDate(Date lastUpdatedDate) { this.lastUpdatedDate = lastUpdatedDate; }
DynamoDBAutoGenerated Timestamp
没有这样的功能,例如 DEFAULT CURRENT TIMESTAMP
或UPDATE CURRENT_TIMESTAMP
.您必须自己设置日期。
但是,如果您想跟踪更新的更改,则可以使用原子计数器之类的东西。
因此,在每次更新时,您都会增加计数器值。
使用 aws-sdk 版本 2.17.169 对我有用的方法:
首先,您需要定义要支持的扩展
自动生成时间戳记录扩展。
@Bean
public DynamoDbEnhancedClient dynamoDbEnhancedClient(){
return DynamoDbEnhancedClient.builder()
.dynamoDbClient(dynamoDbClient())
.extensions(AutoGeneratedTimestampRecordExtension.create())
.build();
}
然后,为 java.time.Instant 创建一个转换器。因为这是当时唯一支持的一个。
import java.time.Instant;
public class InstantToStringTypeConverter implements DynamoDBTypeConverter<String, Instant> {
@Override
public String convert(Instant instant) {
return instant.toString();
}
@Override
public Instant unconvert(String s) {
return Instant.parse(s);
}
最后,在模型上添加注释:
@DynamoDbAutoGeneratedTimestampAttribute
@DynamoDBTypeConverted(converter = InstantToStringTypeConverter.class)
public Instant getCreated() {
return created;
}
public void setCreated(Instant created) {
this.created = created;
}
@DynamoDbAutoGeneratedTimestampAttribute
@DynamoDBTypeConverted(converter = InstantToStringTypeConverter.class)
public Instant getUpdated() {
return updated;
}
public void setUpdated(Instant updated) {
this.updated = updated;
}
在此处查看一些参考资料