java - 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
以成功为集成测试创建二级索引的方式使用注释?
解决方案
推荐阅读
- logback - 如何为 logback 中的单个日志文件定义多个滚动策略?
- algorithm - Get-Record-API 请求不再起作用
- reactjs - Display: none on Deck.gl React 组件导致巨大的性能问题
- javascript - 重定向到组件 onSubmit
- ios - 模拟 iOS Firebase Auth 登录方法
- javascript - 尝试使用 javascript 中的 DOM 创建颜色更改应用程序
- python - 模板匹配使用 opencv 的屏幕截图
- sql - 如何找出方法中会抛出的异常?
- angularjs - 过滤列并在AngularJS中按降序排序
- postgresql - postgresql libpqxx:多个查询作为一个事务