В качестве простого примера у меня есть класс, который выглядит следующим образом:
public class DbData {
@DynamoDBAutoGeneratedKey
@DynamoDBHashKey(attributeName = "id")
private UUID id;
private UUID parent;
// other fields ...
}
Этот класс хранится в таблице DynamoDB.Когда в таблицу добавляется новая запись, я хочу убедиться, что родитель уже существует (если родитель установлен).
Можно ли это сделать с помощью выражения DynamoDBSaveExpression?
Например,Я могу убедиться, что текущий идентификатор не существует:
new DynamoDBSaveExpression()
.withExpectedEntry("id", new ExpectedAttributeValue().withExists(false));
Я думал, что это может работать, но это не так:
ExpectedAttributeValue expectedAttributeValue = new ExpectedAttributeValue(new AttributeValue(parent.toString()));
dynamoDBSaveExpression = new DynamoDBSaveExpression()
.withExpectedEntry("id", new ExpectedAttributeValue().withExists(false));
.withExpectedEntry("id", expectedAttributeValue.withExists(true))
.withConditionalOperator(ConditionalOperator.AND);
Редактировать
Существует RESTful API, который определяет POST для создания ресурса, и ресурс сохраняется как запись в таблице DynamoDB.
Ресурс допускает иерархию, которая указывается с помощью родительского элементаидентификатор.
Если родительский ресурс не найден, возвращается 404:
a. if parent identifier is set
b. get parent resource from DynamoDB
c. if parent not found
d. return 404
e. persist resource in DynamoDB
Псевдокод не является атомарным.«b» может вернуть родителя, но другой поток / процесс может удалить его до «e».
Я надеялся, что выражение условия здесь поможет.Является ли библиотека транзакций единственным способом сделать это?Или данные должны быть смоделированы по-другому?