首页 > 解决方案 > 如何持久化在 Flux 的特定步骤创建的对象,之后不再需要?

问题描述

我正在创建一个对象Employee,并且我还想创建另一个对象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> {
}

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

标签: javareactor

解决方案


改为这样:

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

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

所以,这样你Employee在第一个保存后得到一个新的flatMap(),将它传播到下一个flatMap(),要求.save(event)返回它Mono,但是你用Mono一个基于employee变量的新替换它。

这样,所有内容都将在正确的时间以正确的顺序订阅。


推荐阅读