在事务中插入Slick 3复合列表

时间:2016-03-25 09:24:32

标签: transactions slick-3.0

我需要在事务中使用保存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)
}

你可以帮帮我吗?

1 个答案:

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