Как использовать UpdateItemRequest в транзакции DynamoDB?

#amazon-dynamodb #aws-sdk-java

#amazon-dynamodb #aws-sdk-java

Вопрос:

У меня есть приложение Java Spring, где я использую DynamoDB, пока без транзакций. Однако недавно я столкнулся с новым вариантом использования, который требует совместного сохранения связанных объектов. Я новичок в этой теме и поэтому читал о транзакциях DynamoDB, но не могу найти способ использовать API надлежащим объектно-ориентированным способом. Чего мне не хватает?

На данный момент, когда мне нужно обновить объект, я действую следующим образом, создавая UpdateItemRequest :

 Map<String, AttributeValueUpdate> updates = new HashMap<>();
// fill updates

Map<String, ExpectedAttributeValue> expected = new HashMap<>();
// fill expectations

UpdateItemRequest request = new UpdateItemRequest()
            .withTableName(TABLE_NAME)
            .withKey(key)
            .withAttributeUpdates(updates)
            .withExpected(expected);
dynamoDBClient.updateItem(request);
  

Однако в документации по созданию транзакции рекомендуется следующий синтаксис:

 Map<String, AttributeValue> expressionAttributeValues = new HashMap<>();
expressionAttributeValues.put(":new_status", new AttributeValue("SOLD"));
expressionAttributeValues.put(":expected_status", new AttributeValue("IN_STOCK"));

Update markItemSold = new Update()
    .withTableName(PRODUCT_TABLE_NAME)
    .withKey(productItemKey)
    .withUpdateExpression("SET ProductStatus = :new_status")
    .withExpressionAttributeValues(expressionAttributeValues)
    .withConditionExpression("ProductStatus = :expected_status")
    .withReturnValuesOnConditionCheckFailure(ReturnValuesOnConditionCheckFailure.ALL_OLD);
  

Если бы я следовал документации, то мне нужно было бы создать update expression — но то, что я сохраняю, может быть довольно сложным, и это потребовало бы некоторых сложных манипуляций со строками, что не является удовлетворительным (синтаксический анализатор для создания был бы медленным и подверженным ошибкам).

Есть ли способ получить это update expression из UpdateItemRequest ? Или любой рекомендуемый способ построения таких сложных выражений, например, в виде сериализованной формы чего-либо? Или, что еще лучше, какой-нибудь объектно-ориентированный способ использования транзакций, передавая карту объектов обновления, а не большую строку?

Спасибо.