【发布时间】:2017-03-16 01:08:06
【问题描述】:
我正在尝试根据两个不同列的组合使表中的项目保持唯一。
我有一个 instanceId 和 imageId 列(以及其他列),并且基于 Stackoverflow 和 AWS Forums 上的几篇帖子,下面应该可以吗?
public void saveUnique(Server server) {
DynamoDBSaveExpression saveExpression = new DynamoDBSaveExpression();
Map<String, ExpectedAttributeValue> expectedAttributes =
ImmutableMap.<String, ExpectedAttributeValue>builder()
.put("instanceId", new ExpectedAttributeValue(false))
.put("imageId", new ExpectedAttributeValue(false))
.build();
saveExpression.setExpected(expectedAttributes);
saveExpression.setConditionalOperator(ConditionalOperator.AND);
try {
mapper.save(server, saveExpression);
} catch (ConditionalCheckFailedException e) {
//Handle conditional check
}
}
但是,每次我尝试保存重复项(相同的 instanceId 和 imageId)时,它都会成功保存到数据库中。
我还有什么遗漏吗?
编辑 R.E notionquest 答案
更新到下面的答案。
我有一项工作,每分钟运行一次,轮询 API。 API 的响应表示为Server POJO。 Server 有一个名为 instanceId 的属性。
我想确保如果带有instanceId 的Server 已经在数据库中,请不要保存它。
Server 对象有另一个属性id,它被设置为表主键。
public void saveUnique(Server server) {
DynamoDBSaveExpression saveExpression = new DynamoDBSaveExpression();
Map<String, ExpectedAttributeValue> expected = new HashMap<>();
expected.put("instanceId", new ExpectedAttributeValue(new AttributeValue(server.getInstanceId())).withComparisonOperator(ComparisonOperator.NE));
saveExpression.setExpected(expected);
try {
mapper.save(server, saveExpression);
} catch (ConditionalCheckFailedException e) {
LOGGER.info("Skipped saving as not unique...");
}
}
此代码将一遍又一遍地保存 Server 对象,而不会引发异常。
服务器 POJO
@DynamoDBTable(tableName = "Servers")
public class Server {
@Id
private String id = UUID.randomUUID().toString();
@DynamoDBTypeConvertedJson
private Task task;
@DynamoDBAttribute(attributeName = "instanceId")
private String instanceId;
public Server() {
}
@DynamoDBHashKey
public String getId() {
return id;
}
// other standard getters and setters
}
【问题讨论】:
-
可能,它可能没有在数据库中保存任何内容。 catch 块应该被执行并且方法应该正常结束而没有任何错误。您是否检查了数据库对于相同的 instanceId 和 imageId 是否存在两个不同的项目。它们是否定义为表的分区键和排序键?
-
我发现如果我的分区键设置为instanceId,我上面的代码就可以工作。但是,如果我将其他内容(如通用 ID)设置为分区键,则它不起作用。必须可以检查两个对象是否相等,而不必使用分区键,确定吗?
标签: java amazon-web-services amazon-dynamodb