![](/img/trans.png)
[英]Update if value doesn't exist or check condition in DynamoDBMapper
[英]DynamoDBMapper save only if object doesn't exist
使用Java DynamoDBMapper,如何仅在对象尚不存在时保存对象(基于主键)。 如果确实存在,我想要抛出异常或失败,而不是更新现有条目。
我相信你应该能够使用可以应用于映射器的DynamoDbSaveExpression对象。
有一个在AWS网站的教程在这里如下图所示,代码:
try {
DynamoDBSaveExpression saveExpression = new DynamoDBSaveExpression();
Map expected = new HashMap();
expected.put("status", new ExpectedAttributeValue().withExists(false));
saveExpression.setExpected(expected);
mapper.save(obj, saveExpression);
} catch (ConditionalCheckFailedException e) {
// This means our save wasn't recorded, since our constraint wasn't met
// If this happens, the worker can simply look for a new task to work on
}
以下是使用DynamoDBMapper实现此目的的正确方法:
User newUser = new User();
newUser.setUsername(username);
newUser.setPassword(password);
DynamoDBSaveExpression saveExpr = new DynamoDBSaveExpression();
saveExpr.setExpected(new ImmutableMap.Builder()
.put("username", new ExpectedAttributeValue(false)).build());
dynamoDBMapper.save(newUser, saveExpr);
资料来源: https : //blog.jayway.com/2013/08/24/create-entity-if-not-exists-in-dynamodb-from-java/
编辑:这是我在实践中的实现。 非常容易实现:
public Statement saveIfNotExist(Statement statement) throws ConditionalCheckFailedException {
return mapper.save(statement, new DynamoDBSaveExpression().withExpected(ImmutableMap.of("id", new ExpectedAttributeValue(false))));
}
通过单元测试:
@Test(expectedExceptions = ConditionalCheckFailedException.class)
public void shouldNotProcessIdenticalStatementUpdateInstances() {
Statement statement1 = StatementTestBuilder.valid().build();
Statement statement2 = StatementTestBuilder.valid().withId(statement1.getId()).build();
statementRepository.saveIfNotExist(statement1);
statementRepository.saveIfNotExist(statement2);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.