强制覆盖DynamoDB表名

时间:2015-02-06 11:30:04

标签: java inheritance annotations amazon-dynamodb prototypal-inheritance

我想创建一个通用的DynamoDB架构,它将由许多DynamoDb表类共享:

@DynamoDBTable(tableName = "please_dont_create_me!")
public abstract class Schema {
  @DynamoDBHashKey
  private String id;

  private String value;

  /* setters and getters .. */
}


@DynamoDBTable(tableName = "table_1")
public class FirstTable extends Schema {
}


// Woops, I forgot to annotate with @DynamoDBTable
public class SecondTable extends Schema {

}

保存FirstTable的实例按预期工作:

FirstTable ft = new FirstTable();
ft.setId("occupation");
ft.setValue("artist");
mapper.save(ft);  // Saves (occupation, artist) to 'table_1'

现在保存SecondTable,我忘了用@DynamoDBTable注释:

SecondTable st = new SecondTable();
st.setId("hobby");
st.setValue("drawing");
mapper.save(st);  // Saves (hobby, drawing) to 'please_dont_create_me!'

是否可以以这种方式创建Schema以避免这种情况?

我的想法:

  • Schema必须使用@DynamoDBTable进行注释,否则不会选择它定义的字段(例如,在尝试保存FirstTable时,会抛出一个关于缺少hashKey的异常)
  • tableName是必需的且非null。我可以将它设置为无效的表名(例如,使用名称中的特殊字符)但是......这是一个非常糟糕的解决方案
  • Schema作为接口而不会真正起作用*。主要缺陷是@DynamoDBHashKey和其他字段注释不会被继承。

*我实际上没有尝试过使用界面

2 个答案:

答案 0 :(得分:1)

在没有@DynamoDBTable注释的情况下保存SecondTable时,您期望什么?

如果目标是使用表格名称,我建议您深入了解TableNameResolver

答案 1 :(得分:1)

您希望使用相同的pojo类使表选择动态化。这就是我的做法。

AmazonDynamoDBClient client = new AmazonDynamoDBClient();
DynamoDBMapper mapper = new DynamoDBMapper(client);
client.setEndpoint("http://localhost:8000/");
String tableName="User";
User user = new User(); 
user.setName("Ohelig");
TableNameOverride config = new DynamoDBMapperConfig.TableNameOverride(tableName);
mapper.save(user, new DynamoDBMapperConfig(config));