数据库(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
在数据库里。如果(并且仅当)有一个值,它就可以正常工作。因为在创建整个列时它是空的,所以这完全违背了 ReadingConverter
.
cassandra似乎不支持为每一行设置一个值(比如 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特有的。
表是这样创建和更改的:
CREATE TABLE FancyEntity (
id TEXT,
-- other columns omitted
PRIMARY KEY (id)
);
ALTER TABLE FancyEntity ADD (
usage TEXT
);
cassandra记录了alter table和一个关于用默认值修改表的相关so问题。
暂无答案!
目前还没有任何答案,快来回答吧!