我需要在事务中使用保存ID关系插入下一个案例类:
case class A (id: Long, bList: List[B])
case class B (id: Long, aId: cList: List[C])
case class C (id: Long, bId: Long)
我知道它很容易保存实体,里面有一个列表:
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元素。我需要这样的东西,我知道它不起作用:
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)
}
你可以帮帮我吗?
答案 0 :(得分:1)
下一个解决方案正常工作:
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)
}