1

我想創建一個一般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和其他字段註釋不被繼承。

*我還沒有實際使用的接口

回答

1

沒有@DynamoDBTable註釋保存SecondTable時,你有什麼期望試過嗎?

如果目標是玩表名,我建議你跳進TableNameResolver

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));