背景

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 编写一个自定义的序列化器,并将其保存在一个字段中。

10-07 22:54