gpt4 book ai didi

java - 使用 DynamoDBMapper 保存具有版本化属性的新项目

转载 作者:太空宇宙 更新时间:2023-11-04 11:19:24 26 4
gpt4 key购买 nike

我在 Scala 中有以下 DynamoDB 项目

@DynamoDBTable(tableName = Table)
class DynamoItem {
private var indexId: String = _
@DynamoDBHashKey(attributeName = IndexIdAttribute)
def getIndexId: String = {
indexId
}
def setIndexId(id: String): Unit = {
indexId = id
}

private var version: Long = _
@DynamoDBVersionAttribute(attributeName = VersionAttribute)
def getVersion: Long = {
version
}
def setVersion(version: Long): Unit = {
this.version = version
}
}

我正在尝试在表中保存一个新的 DynamoItem,如下所示

val item = new DynamoItem
item.setIndexId(id = 1L)
// Not setting any version as DynamoDBMapper is supposed to automatically
// set it to 1 for new objects
val dynamoDBMapper = new DynamoDBMapper(amazonDynamoDBClient)
val dynamoDBMapperConfig = (new DynamoDBMapperConfig.Builder).
withConsistentReads(ConsistentReads.CONSISTENT).
withSaveBehavior(SaveBehavior.UPDATE_SKIP_NULL_ATTRIBUTES).
build()

dynamoDBMapper.save(item(), dynamoDBMapperConfig)

但是,我最终在保存调用时收到 ConditionalCheckFailedException 。我已经完成/验证的事情:

  1. 我已验证表中尚不存在该项目(为空)。

  2. 我使用 UPDATE_SKIP_NULL_ATTRIBUTES 作为 SaveBehavior,以便不会删除 null 属性。无论如何,使用 UPDATE 作为 SaveBehavior 也会给出相同的异常。

  3. 我也尝试过将新对象的版本设置为0L和1L。再次出现同样的异常。

那么,问题是如何使用 DynamoDBMapper 保存具有版本化属性的新对象?我需要这个,因为我正在使用乐观锁定,并且希望通过它获得 putIfAbsent 语义(如果该项目已经存在,则失败并出现 ConditionFailedCheckException,否则通过创建版本 1 的新项目来成功)。

最佳答案

Scala 的 Long 与初始保存的 DynamoDBVersionAttribute 不兼容,因为它不可为 null。当您将 Long 初始化为 _ 时,它使用默认值 0L。如果您使用 java.lang.Long,则可以将其初始化为 null,这将使保存工作不会失败。

关于java - 使用 DynamoDBMapper 保存具有版本化属性的新项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45099300/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com