我正在使用DynamoDB映射器在DynamoDB上执行CRUD操作。我有适当的表名覆盖,可以对不同的区域使用不同的表名。我想使用DynamoDB事务库,但是我无法找到一种方法来使用mapper提供对表名的替代。
为此,我想对两个表进行覆盖。
答案 0 :(得分:0)
检查了各种可用的交易文档,对我来说很明显,交易库仅允许单个tableName覆盖。如果对所有表都使用 TableNameOverride ,则很难使用事务处理(如果在单个事务中处理多个表)。我意识到,可能是我在系统中错误地使用了 TableNameOverride 。
经过研究,我发现以下link 该解决方案讨论了如何使用 TableNameResolver 在不同的环境中管理不同的表名。 我要寻找的是独立性,如果需要的话,可以在不同的环境中使用唯一的表名。对我来说,选择想要的名字应该更容易。
那是我想到的:
MyTableNameResolver类
public class MyTableNameResolver extends DynamoDBMapperConfig.DefaultTableNameResolver {
private Map<Class<?>, String> classToTableNameMap;
public MyTableNameResolver(final Map<Class<?>, String> classToTableNameMap) {
super();
this.classToTableNameMap = classToTableNameMap;
}
@Override
public String getTableName(final Class<?> clazz, final DynamoDBMapperConfig config) {
if (!classToTableNameMap.containsKey(clazz)) {
throw new RuntimeException("Appropriate Message");
}
return classToTableNameMap.get(clazz);
}
}
初始化DynamoDB映射器的方式是:
TableNameResolver tableNameReolver = new MyTableNameResolver(dynamoDBTableMap);
// dynamoDBTableMap - this map can be constructed using some mapping from config file
DynamoDBMapperConfig.builder().withTableNameResolver(tableNameReolver).build();
现在您无需在任何地方执行任何表名覆盖,这意味着无需担心一件事,并且可以轻松使用事务。