我正在尝试添加DynamoDBVersionAttribute以在访问/更新DynamoDB表中的项目时合并乐观锁定。但是,我无法弄清楚究竟如何添加version属性。
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.OptimisticLocking.html似乎表明使用它作为创建表的类中的注释是可行的方法。但是,我们的代码库正在以类似于以下格式创建新表:
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();
DynamoDB dynamoDB = new DynamoDB(client);
List<AttributeDefinition> attributeDefinitions= new
ArrayList<AttributeDefinition>();
attributeDefinitions.add(new
AttributeDefinition().withAttributeName("Id").withAttributeType("N"));
List<KeySchemaElement> keySchema = new ArrayList<KeySchemaElement>();
keySchema.add(new
KeySchemaElement().withAttributeName("Id").withKeyType(KeyType.HASH));
CreateTableRequest request = new CreateTableRequest()
.withTableName(tableName)
.withKeySchema(keySchema)
.withAttributeDefinitions(attributeDefinitions)
.withProvisionedThroughput(new ProvisionedThroughput()
.withReadCapacityUnits(5L)
.withWriteCapacityUnits(6L));
Table table = dynamoDB.createTable(request);
如上所述,我无法找到如何通过Java代码添加VersionAttribute的方法。它不是属性定义,因此不确定其去向。关于在哪里可以在CreateTable请求中添加此VersionAttribute的任何指导?
答案 0 :(得分:2)
据我所知,用于乐观锁定的@DynamoDBVersionAttribute批注仅适用于专门为DynamoDBMapper查询建模的表。使用DynamoDBMapper并不是一个糟糕的方法,因为它有效地为DynamoDB项目上的CRUD操作创建了ORM。
但是,如果您现有的代码库无法利用它,那么您的下一个最佳选择可能是使用条件写入来增加版本号(如果它等于您期望的版本号)(即,滚动自己的乐观锁定)。不幸的是,您需要在希望乐观锁定的每个写入中包括增量/条件。
答案 1 :(得分:1)
您的代码仅创建一个表,但是为了使用DynamoDBMapper访问该表,您需要创建一个表示该表的类。例如,如果您的表名为Users,则应创建一个名为Users的类,并使用批注将其链接到表。
您可以保留表创建代码,但是需要创建DynamoDBMapper类。然后,您可以使用DynamoDBMapper类完成所有的加载,保存和查询。
创建类后,只需给它一个名为version的字段并在其上添加注释,DynamoDBMapper将负责其余的工作。