У меня есть таблица 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
, которая успешно создает вторичный индекс для интеграционного теста?