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