Скажем, я хочу сохранить / создать новый элемент в таблице DynamoDb
, если и только если уже не существует какого-либо существующего элемента, который содержал бы referenceId
, равный тому же значению, которое я установил.
В моем случае я хочу создать элемент с withReferenceId=123
, если в таблице нет других withReferenceId=123
.
referenceId
не является первичным ключом!(Я не хочу, чтобы это было так)
Итак, код:
val withReferenceIdValue = "123";
val saveExpression = new DynamoDBSaveExpression();
final Map<String, ExpectedAttributeValue> expectedNoReferenceIdFound = new HashMap();
expectedNoReferenceIdFound.put(
"referenceId",
new ExpectedAttributeValue(new AttributeValue().withS(withReferenceIdValue)).withComparisonOperator(ComparisonOperator.NE)
);
saveExpression.setExpected(expectedNoReferenceIdFound);
newItemRecord.setReferenceId(withReferenceId);
this.mapper.save(newItemRecord, saveExpression); // do not fail..
Это, похоже, не работает.
В таблице referenceId=123
уже save()
не происходит сбой.Я ожидал, что this.mapper.save завершится с ошибкой за исключением.
В: Как сделать так, чтобы он не работал при условии?
Я также проверил этот где они предлагают добавить вспомогательную таблицу (таблицу состояний транзакций) .. потому что кажется, что saveExpression работает только для первичного ключа / ключа раздела ... если так:
не уверен, почему существует такое ограничение.в любом случае, если это первичный ключ, нельзя создать дублирующийся элемент с тем же первичным ключом .. зачем создавать условия на первом месте.3-я таблица - это слишком много ... почему нет ни одного NE для того поля, которое я хочу использовать.Я могу создать индекс для этого поля.не ограничиваясь использованием только первичного ключа .. это то, что я имею в виду
ОБНОВЛЕНИЕ:
Код отображения моей таблицы:
@Data // I use [lombok][2] and it does generate getters and setters.
@DynamoDBTable(tableName = "MyTable")
public class MyTable {
@DynamoDBHashKey(attributeName = "myTableID")
@DynamoDBAutoGeneratedKey
private String myTableID;
@DynamoDBAttribute(attributeName = "referenceId")
private String referenceId;
@DynamoDBAttribute(attributeName = "startTime")
private String startTime;
@DynamoDBAttribute(attributeName = "endTime")
private String endTime;
...
}