Kotlin Spring数据R2DBC持久化嵌套属性

Kotlin Spring数据R2DBC持久化嵌套属性,kotlin,spring-webflux,r2dbc,spring-data-r2dbc,Kotlin,Spring Webflux,R2dbc,Spring Data R2dbc,我有一个列表(或者Flux,如果我愿意的话),其中每个顺序元素都有一个列表。我想使用spring-data-r2dbc(因此reactivecrudepository)和spring-webflux)将此对象层次结构持久化到关系数据库的两个表中。这两个表具有外键约束,因此必须在其项之前插入订单 事务处理是另一个主题,超出了这个问题的范围。应用程序的该部分的返回类型同样应该是Flux,因为它将是REST响应的返回值 问题是如何“组合”一个Mono及其Flux 我已经研究过压缩,但是我无法让它工作(

我有一个
列表
(或者
Flux
,如果我愿意的话),其中每个
顺序
元素都有一个
列表
。我想使用
spring-data-r2dbc
(因此
reactivecrudepository
)和
spring-webflux
)将此对象层次结构持久化到关系数据库的两个表中。这两个表具有外键约束,因此必须在其
之前插入
订单

事务处理是另一个主题,超出了这个问题的范围。应用程序的该部分的返回类型同样应该是
Flux
,因为它将是REST响应的返回值

问题是如何“组合”一个
Mono
及其
Flux

我已经研究过压缩,但是我无法让它工作(参见下面注释掉的代码)。此外,我也很确定,拉链是不是正确的事情反正我有一个在一边和n在另一边。我还尝试了
.doOnSuccess
,但这也使得
通量
没有终端操作

SomeService.kt
fun存储订单(订单:列表):流量{
//带有副作用的flatMap(以及下面的flatMapMany)也不是很好
返回Flux.fromIterable(orders).flatMap{saveOrder(it)}
}
私人娱乐存储订单(订单:订单):Mono{
val soonToBeSavedOrder:Mono=orderRepository.save(订单)
val soonTeBeSavedItems:Flux=soonToBeSavedOrder.flatMapMany{saveItems(it)}
//TODO:如何“组合”Mono和Flux,因为Flux没有
//以这种方式进行终端操作,因此永远不会调用saveItems。
很快就回来
}
私人趣味存储项(顺序:顺序):流量{
return itemRepository.saveAll(order.items)
}
Order.kt
类顺序(
id:UUID,
var someData:String,
@短暂的
val项:MutableList=ArrayList()):可持久{
@身份证
私有变量id:UUID=id
重写fun getId():UUID{return id}
override fun isNew():布尔值{return true}
}
项目1.kt
类项目(
id:UUID,
var someData:String):可持久{
@身份证
私有变量id:UUID=id
重写fun getId():UUID?{return id}
override fun isNew():布尔值{return true}
}
fun saveOrders(orders: List<Order>): Flux<Order> {
    // the flatMap (and flatMapMany below) with side effect isn't that nice either
    return Flux.fromIterable(orders).flatMap { saveOrder(it) }
}

private fun saveOrder(order: Order): Mono<Order> {
    val soonToBeSavedOrder: Mono<Order> = orderRepository.save(order)

    val soonTeBeSavedItems: Flux<Item> = soonToBeSavedOrder.flatMapMany { saveItems(it) }

    // TODO: how to "combine" the Mono and the Flux because the Flux doesn't
    // have a terminal operation that way and therefore saveItems is never called.

    return soonToBeSavedOrder
}

private fun saveItems(order: Order): Flux<Item> {
    return itemRepository.saveAll(order.items)
}
class Order(
    id: UUID,
    var someData: String,
    @Transient
    val items: MutableList<Item> = ArrayList()) : Persistable<UUID> {

    @Id
    private var id: UUID = id

    override fun getId(): UUID { return id }
    override fun isNew(): Boolean { return true }

}
class Item(
    id: UUID,
    var someData: String) : Persistable<UUID> {

    @Id
    private var id: UUID = id

    override fun getId(): UUID? { return id }
    override fun isNew(): Boolean { return true }

}