我正在尝试使用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不起作用?
以及如何解决?
谢谢!
答案 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()
}