我正在尝试使用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不起作用?
以及如何解决?
谢谢!
[好,你不知道为什么,但是如果我将每个“ db-call”放在'then {}'表达式中,就可以了
如果您这样做某事怎么办?您应该始终链接呼叫。
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()
}