背景
Astyanax 的 Entity Persister 将实体的 map 保存在多个列中。格式为mapVariable.key
问题:
当实体中的映射已更新时,astyanax 的实体持久性不会从 cassandra 中删除已删除的键/值对
我现在使用的解决方案(糟糕的方法)
我正在删除整行,然后重新插入
更多信息
我使用 astyanax 的 Entity Persister (com.netflix.astyanax.entitystore) 在 cassandra 中保存我的 java 对象。
我注意到的是,当一个实体的 Map 被持久化为 2 个值时: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用来。如果你看一下它的代码,你会发现它只是将键值对添加到突变批处理中。 4. 当数据在 cassandra 中连续放置时,批处理中的新列被添加,现有列被覆盖,不幸的是旧列保持不变。
此处的一种解决方案是为您的 map 编写自定义序列化程序并将其保存在一个字段中。
关于java - Astyanax 的 EntityPersister 和 Collection 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16674363/