我想创建一个通用的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和其他字段注释不会被继承。


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

最佳答案

保存没有@DynamoDBTable批注的SecondTable时,您会有什么期望?

如果目标是使用表名,建议您进入TableNameResolver

09-17 13:52