Slick 3 - 在事务上,基于其他表插入多个表

时间:2017-10-29 19:56:49

标签: database scala h2 slick slick-3.0

我想要做的是在事务上插入3个表,但后面的插入是基于第一个。

以下是不同的查询:

val personId = persons returning persons.map(_.id)) += Person(occupation)
translatedProperty += TranslatedProperty(languageId, propertyId, propertyName)
personProperties += PersonProperty(personId, propertyId, propertyValue)

现在我从某个地方获得Seq(propertyName, propertyValue)并迭代它。

如果我按顺序插入,如上所述,一切正常,直到它不起作用,因为说数据库“崩溃”。因此,我想以交易方式进行上述插入。

我试过了:

val dbAction = (for {
  val personId = persons returning persons.map(_.id)) += Person(occupation)
  props <- (properties.values.map {
    x =>
    {
      val name = x.key
      val value = x.value

      translatedProperties += TranslatedProperty(languageId, propertyId, name)
      personProperties += PersonProperty(personId, propertyId, value)
    }
  })
} yield ()).transactionally

db.run(dbAction)

这给了我一个编译错误:

  

[错误]发现:Seq [单位]   [error] required:slick.dbio.DBIOAction [?,?,?]   [error] props&lt; - (properties.values.map

然后我尝试使用props = (properties.values.map { ...(而不是<-我使用=),但无济于事。该人被插入,但从未被插入。

我在这里做错了什么?

我认为这是因为props只是Seq[FixedSqlAction]而不只是一个?

我应该提到我在这里使用h2。

1 个答案:

答案 0 :(得分:3)

  

我认为这是因为道具将是Seq [FixedSqlAction]而不仅仅是一个?

是的,这正是原因。

问题的解决方案是将properties.values.map...部分简单地包装到DBIO.seq中,如下所示:

val dbAction = (for {
  val personId = persons returning persons.map(_.id)) += Person(occupation)
  props <- DBIO.seq(properties.values.map {
    x =>
    {
      val name = x.key
      val value = x.value

     val insertTranslatedProperties = translatedProperties += TranslatedProperty(languageId, propertyId, name)
     val insertPersonProperties = personProperties += PersonProperty(personId, propertyId, value)

     insertTranslatedProperties andThen insertPersonProperties 
    }
  }: _*)
} yield ()).transactionally

同时使用andThen链接两个内部插页,将它们合并为一个DBIOAction