java - 如何持久化在 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> {
}
员工将被保存,但事件不会。我不确定这应该如何编码。
解决方案
改为这样:
.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
变量的新替换它。
这样,所有内容都将在正确的时间以正确的顺序订阅。
推荐阅读
- javascript - 如何在不使用模拟的情况下测试具有副作用的函数组合?
- typescript - lastValueFrom 而不是 toPromise() 为什么?
- prometheus - 普罗米修斯幻象计数器重置
- python - 我是否应该将 tkinter Toplevel 用于 Text 小部件?
- python - Python Pydub.AudioSegment 提升音量使曲目长度翻倍
- php - Laravel 多对多枢轴附加错误:“没有这样的表:列表”
- python - SendMessage 只发送字符串的*第一个*字符
- c# - 为什么 dapper 查询失败而 ado 调用失败?
- regex - 使用 nette/tokenizer (PHP) 进行标记的正则表达式规则
- android - 在内部存储最佳实践中保存大量图像