2015-01-22 6 views
7

Ich verwende DynamoDBMapper und möchte nur dann und bedingt speichern, wenn die Kombination aus Hashschlüssel und Bereichsschlüssel nicht vorhanden ist. Ich weiß, dass es Möglichkeiten gibt, UUIDs zu verwenden, um die Möglichkeit einer Kollision zu reduzieren, aber ich möchte mich durch bedingte Speicherungen schützen.DynamoDBMapper für bedingte speichert

Ich stieß auf this article, die DynamoDBSaveExpression verwendet jedoch kann ich nicht angeben, dass die Bedingung "Hashkey AND rangekey" nicht existieren kann. Die API spezifiziert eine withConditionalOperator Methode, aber ich kann das in meiner Klasse nicht sehen. Ich benutze die neueste aws java sdk auch von here.

Irgendwelche Vorschläge, wie Sie bedingt speichern können? Oder was ich falsch mache?

Antwort

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 
} 

Dies verwendet die public ExpectedAttributeValue(Boolean exists) Konstruktor, der nur setExists intern aufruft.

+0

Danke Mike. Ich habe festgestellt, dass ich meine IDE nicht mit dem Gradle-Build synchronisiert habe und daher das neueste AWS-SDK in der IDE nicht verfügbar war. Sobald ich es synchronisiert habe, wurde die Methode setConditionalOperator verfügbar. Danke für deine Antwort. Es ist korrekt, also habe ich es so markiert. – n00b

+0

Ist setConditionalOperator erforderlich? Ist es nicht Standard, alle Bedingungen zu überprüfen? – iamprem

+1

Es gefunden! "Wenn ConditionalOperator nicht angegeben wird, ist AND der Standardwert." von hier aus unter dem Bedingungsoperator Abschnitt: http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html – iamprem