背景
Astyanax的Entity Persister将实体的Map保存为多列。格式为mapVariable.key
问题:
当更新实体中的 map 时,astyanax的实体Persister不会从cassandra中删除已删除的键/值对
我正在使用的解决方案(错误的方法)
我要删除整行,然后重新插入
一些更多信息
我使用astyanax的Entity Persister(com.netflix.astyanax.entitystore)将Java对象保留在cassandra中。
我注意到的是,当实体的Map保留两个值时:testkey:testvalue&testkey2:testvalue2,下一次同一实体的Map保留一个值时(删除了一个键/值对) :testkey:testvalue,则不会从列族中删除testkey2:testvalue2。
因此,作为一种解决方法,我需要删除整行,然后重新插入。
我的插入代码:
final EntityManager<T, String> entityManager = new DefaultEntityManager.Builder<T, String>()
.withEntityType(clazz)
.withKeyspace(getKeyspace())
.withColumnFamily(columnFamily)
.build();
entityManager.put(entity);
我想念什么?这确实是低效的,我认为astyanax的实体持久性应自行解决。
有什么想法吗?
最佳答案
您什么都不会错过。
发生了以下情况:
1. Astyanax为正在序列化的实体的每个字段创建一个ColumnMappers列表。
2.然后,ColumnMappers轮流填充突变批次。
3.对于 map ,使用MapColumnMapper。如果看一下它的代码,您会发现它只是将key:value对添加到了批突变中。
4.将数据放入cassandra中的行中时,将添加该批处理中的新列,现有列将被覆盖,不幸的是旧的列仍保持不变。
这里的一种解决方案是为您的 map 编写一个自定义的序列化器,并将其保存在一个字段中。