astynax的entitypersister和collection更新

kadbb459  于 2021-06-15  发布在  Cassandra
关注(0)|答案(2)|浏览(316)

背景
astyanax的实体持久器将实体的Map保存在多个列中。格式为mapvariable.key
问题是:
当实体中的Map被更新时,astyanax的实体持久器不会从cassandra中删除已删除的键/值对
我现在使用的解决方案(糟糕的方法)
我要删除整行,然后重新插入
更多信息
我使用astyanax的实体持久器(com.netflix.astyanax.entitystore)在cassandra中持久化java对象。
我注意到当一个实体的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的实体持久器应该自己处理这个问题。
有什么想法吗?

kcwpcxri

kcwpcxri1#

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

xzlaal3s

xzlaal3s2#

你没有遗漏任何东西。
结果如下:1。astyanax为序列化实体的每个字段创建一个列Map器列表。2然后,列Map器轮流填充突变批。三。对于Map,使用mapcolumnmapper。如果你看一下它的代码,你会发现它只是添加了key:value pairs 突变批次。4当数据放入cassandra中的一行时,批处理中的新列被添加,现有列被覆盖,不幸的是旧列保持不变。
这里的一个解决方案是为Map编写一个自定义序列化程序,并将其保存在一个字段中。

相关问题