Принудительное переопределение имени таблицы DynamoDB

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 является обязательным и непустым. Я могу установить его на недопустимое имя таблицы (например, используя специальные символы в имени), но.. это очень хакерское решение
  • Наличие Schema в качестве интерфейса вместо этого не будет работать *. Основной недостаток заключается в том, что @DynamoDBHashKey и другие аннотации полей не унаследованы.

* Я не пытался использовать интерфейс

Теги:
amazon-dynamodb
inheritance
annotations
prototypal-inheritance

2 ответа

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

Что вы ожидаете при сохранении SecondTable без аннотации @DynamoDBTable?

Если цель состоит в том, чтобы играть с именем таблицы, я предлагаю вам погрузиться в TableNameResolver.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню