如果我们使用的是mapper对象,是否可以使用具有表名覆盖功能的DynamoDB事务库?

时间:2019-07-10 16:25:33

标签: amazon-dynamodb

我正在使用DynamoDB映射器在DynamoDB上执行CRUD操作。我有适当的表名覆盖,可以对不同的区域使用不同的表名。我想使用DynamoDB事务库,但是我无法找到一种方法来使用mapper提供对表名的替代。

为此,我想对两个表进行覆盖。

1 个答案:

答案 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();

现在您无需在任何地方执行任何表名覆盖,这意味着无需担心一件事,并且可以轻松使用事务。