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

如何持久化在Flux的特定步骤创建的对象,并且之后不再需要?

程枫
2023-03-14

我正在创建一个对象员工,我还想创建另一个对象Event,它充当员工创建的日志。但是,我这样做的方式不会持久化Event。

    @Transactional
    public Mono<Employee> createEmployee(String name) {

        return Mono.fromCallable(() -> {
            Employee employee = new Employee();
            employee.setName(name);
            return employee;
        })
        .flatMap(employee -> {
            return employeeRepository.save(employee);
        })
        .doOnNext(employee -> {
            Event event = new Event();
            event.setDetail("Created employee : " + employee.getName());

            eventRepository
                .save(event)
                // .subscribe() // that didn't help
                ;
        });
    }

存储 库:

@Repository
public interface EmployeeRepository extends ReactiveCrudRepository<Employee, UUID> {
}

@Repository
public interface EventRepository extends ReactiveCrudRepository<Event, UUID> {
}

将保存员工,但不保存事件。我不确定这应该如何编码。

共有3个答案

许马鲁
2023-03-14

这应该可行:

@Transactional
public Mono<Employee> createEmployee(String name) {

    return Mono.fromCallable(() -> {
        Employee employee = new Employee();
        employee.setName(name);
        return employee;
    })
    .flatMap(employee -> {
        return employeeRepository.save(employee);
    })
    .doOnNext(employee -> {
        Event event = new Event();
        event.setDetail("Created employee : " + employee.getName());

        eventRepository
            .save(event)
            .block() // that didn't help
            ;
    });
}
慎俊艾
2023-03-14

如果您在doOnNext中有一个反应性处理,它将永远不会运行。所以,这取决于你来订阅。但我认为最好的办法是使用@Artem Bilan的解决方案

百里飞捷
2023-03-14

相反,像这样:

 .flatMap(employee -> {
        return employeeRepository.save(employee);
    })
 .flatMap(employee -> {
        Event event = new Event();
        event.setDetail("Created employee : " + employee.getName());

        eventRepository
            .save(event)
            .thenReturn(employee);
    })

因此,通过这种方式,您可以在保存第一个 flatMap() 后获得一个新的员工,将其传播到下游的下一个 flatMap()调用 .save(事件) 以返回其 Mono,但随后您将该 Mono 替换为基于员工变量的新一。

这样,一切都将在正确的时间以正确的顺序被订阅。

 类似资料:
  • 我想为每个特定的功能文件指定特定的设置和拆卸步骤。我已经看到了允许代码在每个场景之前执行的钩子,以及在每个功能之前执行代码的钩子。但是我想指定代码在所有场景为一个特定功能运行之前和之后运行一次。 这有可能吗?

  • 问题内容: 我对学习Node and Express并不陌生,但我仍在尝试用express围绕代码流。假设我们在session.js中有如下代码: 假设用户是必需的mongo模式。我发现奇怪的是session.user分配: 由于req变量在重定向后将超出范围,但是我们显然是在执行此操作以保留用户数据,因此我需要弄清楚以下哪种情况描述了正在发生的情况。(A)被分配给req参数的参数(在调用回调时)

  • 1. 前言 本节课程让我们一起体验 Hibernate 的魅力!编写第一个基于 Hibernate 的实例程序。 在本节课程中,你将学到 : Hibernate 的版本发展史; 持久化对象的特点。 为了更好地讲解这个内容,这个初体验案例分上下 2 个章节来讲解。 2. Hibetnate 体系结构 如图可知,应用程序可以通过 Hibernate 为用户提供的接口 API 通知 Hibernate

  • 1. 前言 本节课和大家聊聊持久化对象的 3 种状态。通过本节课程,你将了解到: 持久化对象的 3 种状态; 什么是对象持久化能力。 2. 持久化对象的状态 程序运行期间的数据都是存储在内存中。内存具有临时性。程序结束、计算机挂机…… 内存中的数据将不复存在。 重要的数据,需要使用持久化技术将数据保存到永久性设备上。Hibernate 能够通过 PO(持久化对象) 将数据持久化到数据库。 Hibe

  • 创建新的Shelf # shelve_create.py import shelve with shelve.open('test_shelf.db') as s: s['key1'] = { 'int': 10, 'float': 9.5, 'string': 'Sample data', } # shelve_existing