2016-03-25 9 views
2

Ich muß nächste Fallklassen in der Transaktion mit dem Speichern von ids Beziehung einzufügen:Slick 3 Verbundlisteneinsatz in der Transaktion

case class A (id: Long, bList: List[B]) 
case class B (id: Long, aId: cList: List[C]) 
case class C (id: Long, bId: Long) 

Ich weiß, dass seine leicht innerhalb Entität mit einer Liste zu speichern:

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

Aber ich habe keine Lösung gefunden, um bList-Element-ID für korrekte cList-Elemente zu speichern. Ich brauche so etwas und ich weiß, dass es nicht funktioniert:

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

Könnten Sie bitte helfen Sie mir damit?

Antwort

1

Nächste Lösung funktioniert gut:

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