我想要做的是在事务上插入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。
答案 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