使用DynamoDBMapper

时间:2017-07-14 09:23:22

标签: java scala amazon-web-services amazon-dynamodb

我在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。同样的例外。
  4. 所以,问题是如何使用DynamoDBMapper保存具有版本化属性的新对象?我需要这个,因为我使用乐观锁定,并希望通过此获取putIfAbsent语义(如果项目已经存在,则失败并显示ConditionFailedCheckException,否则通过创建版本1的新项目成功)。

1 个答案:

答案 0 :(得分:0)

Scala的Long与DynamoDBVersionAttribute不兼容,因为它不可为空。将Long初始化为_时,它使用默认值0L。如果您改为使用java.lang.Long,则可以将其初始化为null,这将使得保存在没有条件检查失败的情况下工作。