我在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
。
我已经完成/验证的事情:
我确认该项目中尚不存在该项目(它为空)。
我使用UPDATE_SKIP_NULL_ATTRIBUTES
作为SaveBehavior,因此不会删除null属性。对于它的价值,使用UPDATE
作为SaveBehavior也会给出相同的异常。
所以,问题是如何使用DynamoDBMapper保存具有版本化属性的新对象?我需要这个,因为我使用乐观锁定,并希望通过此获取putIfAbsent语义(如果项目已经存在,则失败并显示ConditionFailedCheckException
,否则通过创建版本1的新项目成功)。
答案 0 :(得分:0)
Scala的Long与DynamoDBVersionAttribute不兼容,因为它不可为空。将Long初始化为_时,它使用默认值0L。如果您改为使用java.lang.Long,则可以将其初始化为null,这将使得保存在没有条件检查失败的情况下工作。