Я хотел бы создать общую схему 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
и другие аннотации полей не унаследованы.* Я не пытался использовать интерфейс
Вы хотите сделать динамический выбор таблицы одним и тем же классом 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));
Что вы ожидаете при сохранении SecondTable без аннотации @DynamoDBTable?
Если цель состоит в том, чтобы играть с именем таблицы, я предлагаю вам погрузиться в TableNameResolver.