首页 > 解决方案 > DynamoDB - 表的 GlobalSecondaryIndex 与 @DynamoDBIndexHashKey 冲突

问题描述

我有一个 DynamoDB 表:

@DynamoDBTable(tableName = "my-table")
data class SomeJobEntity(
  @DynamoDBHashKey
  var jobId: String? = null,
  @DynamoDBIndexHashKey(globalSecondaryIndexName = "jobStatus_idx")
  var jobStatus: String? = null
)

'jobStatus' 字段用 注释@DynamoDBIndexHashKey,这有几个原因(例如,在阅读代码时,您了解该字段有一个索引,您可以安全地查询它)。

在集成测试中,此表是使用以下内容创建的:

val createTableRequest = mapper.generateCreateTableRequest(SomeJobEntity::class.java)
                .withTableName(tableName)
                .withAttributeDefinitions(
                        stringAttribute("jobStatus")
                )
                .withGlobalSecondaryIndexes(
                        createGlobalSecondaryIndex("jobStatus_idx", "jobStatus")
                )
                .withProvisionedThroughput(defaultProvisionedThroughput())

表和createGlobalSecondaryIndex()函数中都定义了预置吞吐量:

ProvisionedThroughput().withReadCapacityUnits(1L).withWriteCapacityUnits(1L)

但是,在集成测试中定义此注释并手动创建二级索引会在执行集成测试时导致问题: com.amazonaws.services.dynamodbv2.model.AmazonDynamoDBException: Cannot have two attributes with the same name

因此,一种可行的解决方案是删除@DynamoDBIndexHashKey注释,并且在集成测试中只创建一个二级索引。

另一方面,如果我们真的想使用这个注解,而不是在 createTableRequest 中创建二级索引,那么它将在没有预置吞吐量的情况下创建索引,并且您会收到错误:com.amazonaws.services.dynamodbv2.model.AmazonDynamoDBException: No provisioned throughput specified for the global secondary index

所以我的问题是:如何@DynamoDBIndexHashKey以成功为集成测试创建二级索引的方式使用注释?

标签: javaamazon-web-serviceskotlinamazon-dynamodb

解决方案


推荐阅读