Slick 3 复合列表插入事务 [英] Slick 3 composite list insert in transaction
本文介绍了Slick 3 复合列表插入事务的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我需要在保存 ids 关系的事务中插入下一个案例类:
I need to insert next case classes in transaction with saving ids relation:
case class A (id: Long, bList: List[B])
case class B (id: Long, aId: cList: List[C])
case class C (id: Long, bId: Long)
我知道用一个列表保存实体很容易:
I know that its easy to save entity with one list inside:
def saveAWithBList(aTableObject: A): Future[Long] = {
val saveQuery = (for {
savedAId <- (aTable returning table.map(_.id)) += aTableObject
savedBRows <- bTable ++= aTableObject.bList.map(_.copy(aId = savedAId))
} yield savedAId).transactionally
database.run(saveQuery)
}
但我没有找到返回 bList 元素 id 以正确保存 cList 元素的解决方案.我需要这样的东西,我知道它不起作用:
But I didn't find solution to return bList element id for correct cList elements saving. I need something like this and I know that it doesn't work:
def saveAWithBListWithCList(aTableObject: A): Future[Long] = {
val saveQuery = (for {
savedAId <- (aTable returning aTable.map(_.id)) += aTableObject
_ <- aTableObject.bList.map { bObject =>
val savedBId = (bTable returning bTable.map(_.id)) += bObject.copy(_.aId = savedAId)
cTable ++= bObject.cList.map(_.copy(bId = savedBId))
}
} yield savedAId).transactionally
database.run(saveQuery)
}
你能帮我吗?
推荐答案
下一个解决方案工作正常:
Next solution works fine:
def saveAWithBListWithCList(aTableObject: A): Future[Long] = {
val saveQuery = (for {
savedAId <- (aTable returning aTable.map(_.id)) += aTableObject
_ <- DBIO.sequence(aTableObject.bList.map { bObject =>
((bTable returning bTable.map(_.id)) += bObject.copy(aId = savedAId)).flatMap { bIdAction =>
cTable ++= bObject.cList.map(_.copy(bId = bIdAction.result))
}
})
} yield savedAId).transactionally
database.run(saveQuery)
}
这篇关于Slick 3 复合列表插入事务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文