我来自关系型数据库背景,我们有一种方法为行创建和更新填充时间戳。但是我发现在DynamoDB中很难找到类似的功能。
我检查了DynamoDB并发现它支持自动填充每个条目的日期时间戳。虽然可以创建随机ID,但这不是我所需要的。
我的用例是在将任何条目添加到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; }
没有类似于DEFAULT CURRENT TIMESTAMP
或UPDATE CURRENT_TIMESTAMP
的功能。您需要自己设置日期。
但是,如果您想跟踪更新时的更改,则可以使用类似原子计数器的东西。
因此,在每次更新时,您将增加计数器值。
对我有效的是使用 aws-sdk-version 2.17.169:
首先,您需要定义支持的扩展
AutoGeneratedTimestampRecordExtension。
@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;
}
查看一些参考资料在这里