使用cassandra反应存储库的数据库更改集

问题描述 投票:1回答:2

我正在尝试使用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不起作用?

以及如何解决?

谢谢!

cassandra spring-data project-reactor spring-data-cassandra
2个回答
0
投票

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


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()
}
© www.soinside.com 2019 - 2024. All rights reserved.