Spring Data R2DBC保留嵌套属性

我有一个List<Order>(如果需要,也可以是Flux<Order>),其中每个Order元素都有一个List<Item>。我想使用spring-data-r2dbc(因此使用ReactiveCrudRepository)和spring-webflux将这个对象层次结构保存到关系数据库的两个表中。这两个表具有外键约束,因此必须在其Order之前 插入Item

事务处理是另一个主题,不在这个问题的范围内。该应用程序那部分的返回类型应该再次为Flux<Order>,因为它将是REST响应的返回值。

问题是如何“结合” Mono<Order>及其Flux<Item>

我已经研究过压缩,但是无法正常工作(请参见下面的注释代码)。另外,我非常确定压缩不是正确的做法,因为一侧是 ,另一侧是 n 。我也尝试过.doOnSuccess,但这也使Flux<Item>没有进行终端操作。

SomeService.kt

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)
}

Order.kt

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 }

}

Item.kt

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 }

}
fluid120 回答:Spring Data R2DBC保留嵌套属性

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/2893190.html

大家都在问