首页 > 解决方案 > 使用 cassandra 反应式存储库在 db 上进行的一组更改

问题描述

我正在尝试使用 projectreactor 和 ReactiveCassandraRepository 在 2 个 cassandra 表上做一些混合逻辑。表看起来像这样:

1) 用户 ID (pk) | hashId

2) hashIf (pk) | 用户身份

当我获得新的 userId 时,我需要使用 spring 数据在两个表中更改该值。我尝试这样做:

fun change(userId: String, oldUserId: String) {
    userIdToHashRepository
        .findAllByUserId(oldUserId)
        .flatMap { response ->
            // response is object like Check(val userId: String, val hash: String)
            userIdToHashRepository.saveUserIdAndHash(
                userId,
                response.hash
            )
            hashToUserIdRepository.updateUserIdByHash(
                userId,
                response.hash
            )
        }
        .doOnNext {
            userIdToHashRepository.deleteAllByUserId(oldUserId.toString())
        }
        .subscribe()
}

当我从表中的值开始时:

1) userId | hashId
    111     111111

2) hashId | userId
   111111  111

newUserId=444

我明白了:

1) 

    userId | hashId

        111     111111

(没有附加行,也没有删除旧行,这很可悲)

2) hashId | userId

   111111  444

   111111  111

(行是附加的,但我想删除旧行)

那么请你说,为什么只有 flatMap 之后的第二种方法有效?为什么 doOnNext 不起作用?

以及如何解决这个问题?

谢谢!

标签: cassandraspring-dataproject-reactorspring-data-cassandra

解决方案


如果你做这样的事情怎么办?您应该始终链接调用。

fun change(userId: String, oldUserId: String) {
    userIdToHashRepository
        .findAllByUserId(oldUserId)
        .flatMap ( response ->
            // response is object like Check(val userId: String, val hash: String)
             userIdToHashRepository.saveUserIdAndHash(
                userId,
                response.hash
            )}
         .flatMap( response -> hashToUserIdRepository.updateUserIdByHash(
                userId,
                response.hash
            )
        .doOnNext {
            userIdToHashRepository.deleteAllByUserId(oldUserId.toString())
        }
        .subscribe()
}

推荐阅读