使用cassandra反应式存储库在数据库上进行的一组更改

时间:2020-02-23 14:32:29

标签: cassandra spring-data project-reactor spring-data-cassandra

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

1)userId(pk)| hashId

2)hashIf(pk)| userId

当我获得新的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不起作用?

以及如何解决?

谢谢!

2 个答案:

答案 0 :(得分:0)

好吧,你不知道为什么,但是如果我将每个“ db-call”都放在“ then {}”表达式中,那就可以了

答案 1 :(得分:0)

如果您做这样的事怎么办?您应该始终链接呼叫。

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()
}