【发布时间】:2021-11-03 10:09:11
【问题描述】:
我正在尝试在 Kotlin 中为 DynamoDB 使用事务性写入。
用例: 我想在同一个事务中将两个不同的对象写入两个不同的表。例如 : 将AClass写入表1,将BClass写入表2。
如果每个场景的 Table1 和 Table2 的名称都相同,这将很简单。
但是,我使用的是无服务器框架,具体取决于指定的阶段,
Table1 可以是:local-Table1 / dev-Table1 / production-Table1。
表 2 相同
但是,在我的 AClass 类声明中,如果我尝试使用 @DynamoDBTable(tableName = "$stage-Table1") 注释 AClass,则会收到错误 An annotation argument must be a compile-time constant.
这意味着需要在流程中单独提供表名。为了在通常的写入/获取场景中克服这个问题,我使用了以下设置:
private val dynamoDBMapperConfig = DynamoDBMapperConfig.Builder()
.withTableNameOverride(DynamoDBMapperConfig.TableNameOverride.withTableNameReplacement(tableName))
.build()
mapper.save(t, dynamoDBMapperConfig)
根据文档,我必须执行以下操作:
TransactionWriteRequest transactionWriteRequest = new TransactionWriteRequest()
transactionWriteRequest.addPut(aClassObject)
transactionWriteRequest.addPut(bClassObject)
mapper.transactionWrite(transactionWriteRequest)
如果将 AClass 和 BClass 的对象写入同一个表中,我可以再次使用自定义 DynamoDBMapperConfig。但是,这两个对象都需要写在两个不同的表中,并且由于需要在运行时解析表名,所以我不能将它们作为 Class 注释的一部分。
我该如何解决这个问题? (我想使用对象映射器)
【问题讨论】:
标签: kotlin amazon-dynamodb serverless objectmapper