База данных (Cassandra) не позволяет указывать значение по умолчанию при добавлении новых столбцов. Таким образом, новые столбцы - null
для каждой строки.
Теперь мы добавили флаг в нашу сущность (которая может получить больше записей в будущем):
enum UsageFlag {
OTHER,
SPECIAL_VALUE,
}
Мы также добавили ReadingConverter:
@ReadingConverter
public class UsageFlagReadingConverter implements Converter<String, UsageFlag> {
@Nonnull
@Override
public UsageFlag convert(String source) {
return source == null
? UsageFlag.OTHER
: UsageFlag.valueOf(source);
}
}
Он должен в основном обрабатывать null
как UsageFlag.OTHER
при анализе любого другого ненулевого значения как члена перечисления.
Однако это не работает, поскольку, согласно в документации Spring метод convert конвертера вызывается только в том случае, если значение равно , а не null
. Из-за этого поле этой сущности остается null
, если оно равно null
в базе данных. Он отлично работает , если (и только если) есть значение. Поскольку при его создании весь столбец имеет значение NULL, это полностью противоречит цели ReadingConverter
.
Кассандра, похоже, не поддерживает установку значения для каждой строки (например, UPDATE foo SET flag='OTHER' WHERE True
), поэтому это выглядело как хороший вариант. Мы не хотели трогать каждую строку в базе данных вручную.
Есть ли способ использовать Spring, чтобы помочь в этой ситуации? Или есть способ решить эту проблему с помощью CQL или Cassandra?
Изменить: Еще один контекст в настройке:
public interface FancyEntityRepository extends MapIdCassandraRepository<FancyEntity> {
}
public class FancyEntity {
@PrimaryKeyColumn(name = "id", ordinal = 0, type = PrimaryKeyType.PARTITIONED)
private string id;
private UsageFlag usage;
// other columns omitted
// getters and setter omitted for this example
}
// Somewhere in a service:
FancyEntity fe = fancyEntityRepository.findOne("1");
System.out.println(fe.getUsage());
Но я не думаю, что поведение конвертера cassandra-specifici c.
Таблица была создана, а затем изменена следующим образом:
CREATE TABLE FancyEntity (
id TEXT,
-- other columns omitted
PRIMARY KEY (id)
);
ALTER TABLE FancyEntity ADD (
usage TEXT
);
Cassandra Docs на ALTER TABLE и связанный вопрос SO об изменении таблиц со значением по умолчанию .