Astyanax的EntityPersister&Collection更新

Vla*_*mir 6 java cassandra astyanax

背景

Astyanax的Entity Persister将实体地图保存在多个列中.格式为mapVariable.key

问题:

当实体中的地图更新时,astyanax的Entity Persister不会从cassandra中删除已删除的键/值对

我正在使用的解决方案(糟糕的方法)

我正在删除整行,然后重新插入它

更多信息

我使用astyanax的Entity Persister(com.netflix.astyanax.entitystore)将我的java对象保存在cassandra中.

我注意到的是,当一个实体的地图被持久化时,例如,2个值:testkey:testvalue&testkey2:testvalue2,并且下一次相同的实体地图被持有一个值(一个键/值对被删除) :testkey:testvalue,testkey2:testvalue2未从列系列中删除.

因此,作为解决方法,我需要删除整行然后重新插入它.

我的插入代码:

        final EntityManager<T, String> entityManager = new DefaultEntityManager.Builder<T, String>()
            .withEntityType(clazz)
            .withKeyspace(getKeyspace())
            .withColumnFamily(columnFamily)
            .build();
    entityManager.put(entity);
Run Code Online (Sandbox Code Playgroud)

我错过了什么?这是非常低效的,我认为astyanax的实体persister应该自己解决这个问题.

有什么想法吗?

小智 2

你没有错过任何东西。

发生的情况如下: 1. Astyanax 创建一个 ColumnMappers 列表,每个列映射器对应序列化实体的每个字段。2. 然后,ColumnMappers 轮流填充突变批次。3. 对于地图,使用MapColumnMapper 。如果你看一下它的代码,你会发现它只是将键:值对添加到突变批次中。4. 当数据在 cassandra 中放入一行时,批次中的新列将被添加,现有列将被覆盖,不幸的是旧列保持不变

这里的一种解决方案是为您的地图编写一个自定义序列化程序并将其保存在一个字段中。