背景
Astyanax的Entity Persister将实体地图保存在多个列中。格式为mapVariable.key
问题:
当实体中的地图更新时,astyanax的Entity Persister不会从cassandra中删除已删除的键/值对
我正在使用的解决方案(糟糕方法)
我正在删除整行,然后重新插入
更多信息
我使用astyanax的Entity Persister(com.netflix.astyanax.entitystore)将我的java对象保存在cassandra中。
我注意到的是,当实体的地图持续时,例如,2个值:testkey:testvalue& testkey2:testvalue2,下次使用一个值(删除一个键/值对)持久保存相同的Entity 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的实体persister应该自己解决这个问题。
有什么想法吗?
答案 0 :(得分:2)
你没有遗漏任何东西。
以下是: 1. Astyanax为序列化下的实体的每个字段创建一个ColumnMappers列表。 然后,ColumnMappers轮流填充变异批处理。 3.对于地图,使用MapColumnMapper。如果你看看它的代码,你会发现它只是将关键:值对添加到变异批处理中。 4.当数据在cassandra中连续放置时,批量中的新列将被添加,现有的列将被覆盖,旧的列不幸保持不变。
这里的一个解决方案是为地图编写自定义序列化程序并将其保存在一个字段中。
答案 1 :(得分:1)
查看https://github.com/deanhiller/playorm其orm mapper for cassandra,hbase和其他一些nosql数据库。它会在保存时从集合中删除项目。它也比astyanax更容易使用。