2015-01-22 22 views
7

DynamoDBMapper kullanıyorum ve sadece ve eğer hashkey ve range key kombinasyonu yoksa, koşullu olarak kaydetmek istiyorum. Çarpışma olasılığını azaltmak için UUID'leri kullanmanın yolları olduğunu biliyorum, ancak şartlı tasarrufları kullanarak kendimi korumak istiyorum. DynamoDBMart koşulu için kaydeder

Ben durum "hashkey VE rangekey" var olamaz olduğunu belirtmek mümkün değilim ancak DynamoDBSaveExpression kullandığı this article geldi. API, withConditionalOperator yöntemini belirtir, ancak bunu sınıfımda göremiyorum. En son aws java sdk'yi here'dan kullanıyorum.

Koşullu olarak kaydetme konusunda herhangi bir öneriniz var mı? Ya da yanlış ne yapıyorum?

cevap

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 
} 

Bu sadece dahili olarak setExists çağırır public ExpectedAttributeValue(Boolean exists) yapıcısı kullanır.

+0

Teşekkürler Mike. IDE'mizi platform derlemesiyle senkronize etmediğimi ve en son AWS SDK'nın IDE'de mevcut olmadığını fark ettim. Senkronize ettiğimde setConditionalOperator yöntemi kullanıma sunuldu. Cevabınız için teşekkürler. Doğru, bu yüzden onu işaretledim. – n00b

+0

Bu setConditionalOperator gerekli mi? Tüm koşulu doğrulamak varsayılan değil mi? – iamprem

+1

Bulundu! "ConditionalOperator'ı atlarsanız, AND varsayılan değerdir." Buradaki koşullu operatör bölümünden: http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html – iamprem