如何使用 Reactor 保存嵌套实体?

如何解决如何使用 Reactor 保存嵌套实体?

我将 Spring 与 R2DBC 一起使用,我需要执行以下操作:

for (var q: quiz.quizzes()) {

  Set<UUID> qsIds = new LinkedHashSet<>();

  for (var qs: q.questions()) {
   var ansids = answerRepository
            .saveAll(mapToAnswerEntity(qs.getAnswers()))
            .collectList().toFuture()
            .get()
            .stream()
            .map(AnswerEntity::id)
            .collect(Collectors.toSet());
   var qe = QuestionEntity.builder().id(qs.getId()).answerIds(ansids).title(qs.getTitle()).build();
   var id = questionRepository.save(qe).toFuture().get().id();
   qsIds.add(id);
  }
  var newQ = quizRepository
          .save(
                  toQuizEntity(q,qsIds)).toFuture().get();

 var updatedCourse =  courseRepository.findById(courseId).toFuture().get().addQuizToCourse(newQ.id());
  courseRepository.save(updatedCourse);
}

return Mono.empty();

问题是我不能使用 .get() 因为 Reactor 要求(我使用的是 Webflux)。

我尝试了以下方法:

return Flux.fromIterable(quiz.quizzes())
        .flatMap(q-> Flux.zip(Flux.just(q),Flux.fromIterable(q.questions())))
        .flatMap(t->
                Flux.zip(Flux.just(t.getT1()),Flux.defer(()->Flux.just(t.getT2())),Mono.from(answerRepository.saveAll(mapToAnswerEntity(t.getT2().getAnswers())).collectList())))
        .flatMap(t->
                Flux.zip(
                        Flux.just(t.getT1()),Flux.just(toQuestionEntity(t)).collect(Collectors.toSet())))

        .flatMap(t-> Flux.zip(Flux.just(t.getT1()),questionRepository.saveAll(t.getT2()).collectList()))
        .map(t-> toQuizEntity(t.getT1(),t.getT2().stream().map(QuestionEntity::id).collect(Collectors.toSet())))
        .flatMap(t-> quizRepository.save(t))
        .flatMap(q-> courseRepository.findById(courseId).map(x->x.addQuizToCourse(q.id())))
        .flatMap(c-> courseRepository.save(c))
        .then(Mono.empty());

但是,这并没有返回我期望的所有结果。基本上只保存相对于第一个测验的第一个或最后一个结果(问题和答案)。 2 个测验(我用于测试目的)保存在数据库中,只是它们的“依赖项”受到影响。 2 个问题(每个测验 1 个)保存了其他问题。答案几乎相同。

编辑

我试过这个方法,解决了之前的问题,但是现在quiz_ids列只添加了一门课程。

return Flux.fromIterable(quiz.quizzes())

        .flatMap(q-> Flux.fromIterable(q.questions())
                        .flatMap(qs-> answerRepository
                                .saveAll(mapToAnswerEntity(qs.getAnswers()))
                                        .collect(Collectors.toSet())
                                        .flatMap(l-> Mono.just(l.stream().map(AnswerEntity::id).collect(Collectors.toSet())))
                                        .flatMap(l -> Mono.defer(()-> Mono.just(toQuestionEntity(qs,l)))))
                                .collect(Collectors.toSet())
                                        .flatMap(l-> questionRepository.saveAll(l).collect(Collectors.toSet()))
                                        .map(l->l.stream().map(QuestionEntity::id).collect(Collectors.toSet()))
                                        .flatMapMany(qsl-> quizRepository.save(toQuizEntity(q,qsl)))
                                        .doOnNext(System.out::println))
        .flatMap(qe->Flux.defer(()->courseRepository.findById(courseId).map(x->x.addQuizToCourse(qe.id())).flatMap(c->courseRepository.save(c))))
        .doOnNext(System.out::println)
        .then(Mono.empty());

这是在课程中添加测验的原因: x.addQuizToCourse(qe.id())

这是日志记录的结​​果:

    QuizEntity(id=e9e13855-2c42-456e-9fab-a0865ad96a3f,quizName=1111,quizContent=julia2020 2 test quiz content,questionIds=[a5d576f0-afc9-4312-9f29-cdc018eb635a,cc7282c5-ffd0-4750-9180-ca5e50d4f515])
QuizEntity(id=73315bac-dce0-4595-91c2-85fe2a2e4765,quizName=2222,quizContent=julia2020 test quiz content,questionIds=[b4b1765e-e41a-427b-9073-ad2b16dabe3a,0e9ad984-b63a-4ca4-aa12-efa1a3e7ae6a])
CourseAggregate(id=776fff36-34d9-4b53-8395-c72ee4816f3f,courseName=Mammia course,description=<p>Test Courseasdsadsadsasadasdsa</p>,status=DRAFT,teacherId=79ab22d9-af94-49f1-a25e-c74bada7ce6f,studentIds=[],lessonIds=[4f364a50-bc28-4d75-9f76-71ff43d30ebf,eaaab4ae-6ab4-4a14-a906-259293780e17,28db0295-82ab-4074-aff7-5e10374191b5],quizIds=[e9e13855-2c42-456e-9fab-a0865ad96a3f])
CourseAggregate(id=776fff36-34d9-4b53-8395-c72ee4816f3f,quizIds=[73315bac-dce0-4595-91c2-85fe2a2e4765])

如您所见,最后一门课程汇总不包含前一课程,而仅包含当前测验 ID。

编辑 2: 我用 delayUntil 解决了这个问题:

return Flux.fromIterable(quiz.quizzes())

        .flatMap(q-> Flux.fromIterable(q.questions())
                        .flatMap(qs-> answerRepository
                                .saveAll(mapToAnswerEntity(qs.getAnswers()))
                                        .collect(Collectors.toSet())
                                        .flatMap(l-> Mono.just(l.stream().map(AnswerEntity::id).collect(Collectors.toSet())))
                                        .flatMap(l -> Mono.defer(()-> Mono.just(toQuestionEntity(qs,qsl)))
                                        .doOnNext(System.out::println))
        .delayUntil(qe-> courseRepository.findById(courseId).map(x->x.addQuizToCourse(qe.id())).flatMap(c->courseRepository.save(c)))
        .doOnNext(System.out::println)
        .then(Mono.empty());

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res