2017-07-14 5 views
1

を使用してバージョン管理の属性を持つ新しいアイテム私はスカラ座保存DynamoDBMapper

@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 
    } 
} 

で、次のDynamoDBのアイテムを持っている私は、しかし

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) 

を次のようにテーブルに新しいDynamoItemを保存しようとしています私はセーブコールでConditionalCheckFailedExceptionを得ることになります。私はすでに検証/行っている もの:

  1. 私は、項目がすでに(それのnull)テーブルに存在しないことを確認しました。

  2. null属性が削除されないようにSaveBehaviorとしてUPDATE_SKIP_NULL_ATTRIBUTESを使用しました。価値があるものについては、SaveBehaviorとしてUPDATEを使用すると同じ例外が発生します。

  3. また、新しいオブジェクトのバージョンを0Lと1Lに設定しようとしました。再度同じ例外があります。

したがって、DynamoDBMapperを使用してバージョン管理された属性を持つ新しいオブジェクトを保存するにはどうすればよいですか?これは、オプティミスティックロックを使用しており、アイテムが既に存在する場合はConditionFailedCheckExceptionで失敗し、それ以外の場合はバージョン1の新しいアイテムを作成することで成功するという意味でputIfAbsentセマンティクスを得ることを望んでいるためです。

+0

スカラーではなく上記のモデルでJavaクラスを試しましたか? – notionquest

答えて

0

ScalaのLongは、Nullableではないため、初期セーブ用のDynamoDBVersionAttributeと互換性がありません。 Long as _を初期化すると、デフォルト値0Lが使用されます。代わりにjava.lang.Longを使用する場合は、nullとして初期化することができます。これにより、条件チェックが失敗することなく保存作業が行われます。