我想创建一个通用的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的异常)Schema
作为接口而不会真正起作用*。主要缺陷是@DynamoDBHashKey
和其他字段注释不会被继承。*我实际上没有尝试过使用界面
答案 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));