#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
? Или любой рекомендуемый способ построения таких сложных выражений, например, в виде сериализованной формы чего-либо? Или, что еще лучше, какой-нибудь объектно-ориентированный способ использования транзакций, передавая карту объектов обновления, а не большую строку?
Спасибо.