2015-01-22 3 views
7

Я использую DynamoDBMapper и хотел бы условно сохранить, если и только если комбинация клавиш hashkey и range не существует. Я знаю, что есть способы использовать UUID, чтобы уменьшить вероятность столкновения, но я хотел бы защитить себя, используя условные сбережения.DynamoDBMapper для условных сбережений

Я столкнулся с this article, который использует DynamoDBSaveExpression, однако я не могу указать, что условие «hashkey AND rangekey» не может существовать. API указывает метод withConditionalOperator, но я не могу видеть это в своем классе. Я использую последний aws java sdk также от here.

Любые предложения о том, как условно сохранить? Или что я могу делать неправильно?

ответ

18
DynamoDBSaveExpression saveExpression = new DynamoDBSaveExpression(); 
Map<String, ExpectedAttributeValue> expectedAttributes = 
    ImmutableMap.<String, ExpectedAttributeValue>builder() 
     .put("hashKey", new ExpectedAttributeValue(false)) 
     .put("rangeKey", new ExpectedAttributeValue(false)) 
     .build(); 
saveExpression.setExpected(expectedAttributes); 
saveExpression.setConditionalOperator(ConditionalOperator.AND); 
try { 
    dynamoDBMapper.save(objectToSave, saveExpression); 
} catch (ConditionalCheckFailedException e) { 
    //Handle conditional check 
} 

Это использует public ExpectedAttributeValue(Boolean exists) конструктор, который только внутренне вызывает setExists.

+0

Спасибо, Майк. Я понял, что я не синхронизировал свою IDE с сборкой градиента, и поэтому последний AWS SDK не был доступен в среде IDE. Как только я синхронизировал его, метод setConditionalOperator стал доступен. Спасибо за Ваш ответ. Это правильно, поэтому я отметил это как таковое. – n00b

+0

Требуется ли это setConditionalOperator? Не является ли по умолчанию проверять все условия? – iamprem

+1

Нашел! «Если вы опускаете ConditionalOperator, то AND по умолчанию». отсюда в разделе условного оператора: http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html – iamprem

Смежные вопросы