当前位置: 首页 > 知识库问答 >
问题:

Webflux mongo保存多个模型

慕容典
2023-03-14
@DBRef
private List<Server> servers;

在要创建服务器的控制器中,我首先创建并保存服务器,然后将服务器添加到user中的服务器列表中,并保存该用户:

@PostMapping
public Mono create(@Valid @RequestBody Server server, Mono<Authentication> authentication) {
    return this.serverRepository.save(server) // This works, the server is saved.
            .and(authentication.map(value -> {
                User user = (User) value.getDetails();
                System.out.println(user); // This works, so this function is called.
                if (user.getServers() == null) {
                    // Create empty list so .add can be used.
                    user.setServers(new ArrayList<>());
                }
                user.getServers().add(server);
                return userRepository.save(user); // Isn't working, in the UserCascadeSaveMongoEventListener I don't see it.
            }));
}

我认为我使用.and()的方式是不对的。

要保存关系,我使用UserCascadeSavemongoEventListener:

public class UserCascadeSaveMongoEventListener extends AbstractMongoEventListener<Object> {

    @Autowired
    private MongoOperations mongoOperations;

    @Override
    public void onBeforeConvert(BeforeConvertEvent<Object> event) {
        Object source = event.getSource();
        System.out.println(source); // On server create only the Server is shown, User is not shown.
        if ((source instanceof User) && (((User) source).getServers() != null)) {
            mongoOperations.save(((User) source).getServers());
        }
    }
}

使用的存储库都是正常的ReactiveCrudRepositories。

用多个mono响应调用多个存储库的正确方法是什么?

共有1个答案

易衡
2023-03-14

save调用实际上并不保存,而是设置一个可用于保存的反应管道。该操作仅在某些内容订阅时才执行:

Mono<User> savedUser = userRepository.save(user);

因此,您应该在您的controller方法中组合各种位,并确保没有任何反应类型被单独保留。

通过在保存操作之后添加log()运算符,您可以看到这一点-没有任何东西订阅它,因此不执行该操作。

@PostMapping
public Mono<User> create(@Valid @RequestBody Server server, Mono<Authentication> authentication) {
    return this.serverRepository.save(server) // This works, the server is saved.
            .then(authentication.flatMap(value -> {
                User user = (User) value.getDetails();
                System.out.println(user); // This works, so this function is called.
                if (user.getServers() == null) {
                    // Create empty list so .add can be used.
                    user.setServers(new ArrayList<>());
                }
                user.getServers().add(server);
                return userRepository.save(user);
            }));
}
 类似资料:
  • 我试图保存多个记录通过 但是从上面来看,只创建了第一个数组。我哪里做错了?感谢您的帮助。

  • 我想在一个外键中保存多个关系对象,但不幸的是,我在下面附加了一个错误。我的数据库中已经有ID为189的对象 错误: views.py 序列化程序。派克 模型。派克

  • 我有以下数据: 我运行一个for循环来可视化数据。它为每个州和经济体制作了两个图表。 仅创建最后(第二)个图表的图片。如何将两个图表保存为png或其他格式的图像。即使我删除之前的缩进,它仍然不起作用。

  • 我正在学习cakephp,已经做了很多。我问这个问题的唯一原因是cakePHP中的文档可能是错误的。我不能从文档或过去的stackoverflow帖子中看到为什么(子)教师表不保存(父)用户表中id表中的user_id。我得到没有错误,但user_id是0在教师表,所以它不捡起它从用户表。我在两个模型上有一对一的关系。我只是测试保存超过2个模型,我有一个用户和老师。我只是在表单中输入数据,并创建一

  • 问题内容: 我在从表单保存许多字段时遇到问题。这是我的模型: 在这里,我在中处理发布请求: 每当我通过表单保存时,只有Notes文本字段都会保存在PHIssue实例中,并且许多字段都是空白。有人可以帮我找出问题所在吗? 问题答案: 使用时,你必须致电 关系要求先保存父对象,而你并没有使用

  • 问题内容: Laravel中是否有回调,例如: 我搜索了但什么也没找到。如果没有这样的东西-实施它的最佳方法是什么? 谢谢! 问题答案: 实际上,Laravel在保存|更新|创建某些模型之前具有真实的回调。检查一下: https://github.com/laravel/laravel/blob/3.0/laravel/database/eloquent/model.php#L362 像保存和保存