【问题标题】:Slick 3 composite list insert in transactionSlick 3复合列表插入事务
【发布时间】:2016-03-25 09:24:32
【问题描述】:

我需要在事务中插入下一个案例类并保存 ids 关系:

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

你能帮帮我吗?

【问题讨论】:

    标签: transactions slick-3.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)
      }
    

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 2016-04-30
      • 2015-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-01
      • 2017-01-15
      相关资源
      最近更新 更多