6

背景

Astyanax 的 Entity Persister 将 Entity 的 Map 保存在多个列中。格式为 mapVariable.key

问题:

当实体中的地图已更新时,astyanax 的实体持久性不会从 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);

我错过了什么?这真的是低效的,我认为 astyanax 的实体持久化器应该自己处理这个问题。

有什么想法吗?

4

2 回答 2

2

你没有错过任何东西。

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

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

于 2013-09-03T17:21:29.617 回答
1

看看https://github.com/deanhiller/playorm它的 orm 映射器,用于 cassandra、hbase 和其他一些 nosql 数据库。它会在保存时从集合中删除项目。它也比 astyanax 更容易使用。

于 2013-08-19T19:21:53.743 回答