2016-01-02 45 views
1

這是事情。斯卡拉油滑如何插入以前返回的自動增量的行ID

我使用的是Slick 3.1.0,基本上我有兩個模型,另一個有FK約束。比方說:

case class FooRecord(id: Option[Int], name: String, oneValue: Int) 

class FooTable(tag: Tag) extends Table[FooRecord](tag, "FOO"){ 
    def id = column[Int]("ID", O.PrimaryKey, O.AutoInc) 
    def name = column[String]("NAME") 
    def oneValue = column[Int]("ONEVALUE") 
} 
val fooTable = TableQuery[FooTable] 

case class BarRecord(id: Option[Int], name: String, foo_id: Int) 

class BarTable(tag: Tag) extends Table[BarRecord](tag, "BAR"){ 
    def id = column[Int]("ID", O.PrimaryKey, O.AutoInc) 
    def name = column[String]("NAME") 
    def fooId = column[Int]("FOO_ID") 
    def foo = foreignKey("foo_fk", fooId, fooTable)(_.id) 
} 

它們用來存儲一個富,和幾個酒吧,其中一欄只有一個富。 我一直在想如何在單個事務上執行完整的插入語句集。即。

DBIO.seq( 
(fooTable returning fooTable.map(_id)) += Foo(None, "MyName", 42), 
(barTable returning batTable.map(_id)) += Bar(None, "MyBarname", FOO_KEY) 
) 

但事情是我無法找到方式來獲取Foo ID作爲欄實例字段上的FOO_KEY。 當然,我可以執行DBAction兩次,但在我看來這是非常糟糕的。 有什麼想法?

在此先感謝

回答

0

只是測序你DBIO交易和第一結果傳遞到最簡單的方式,第二:

val insertDBIO = for { 
    fooId <- (fooTable returning fooTable.map(_id)) += Foo(None, "MyName", 42) 
    barId <- (barTable returning batTable.map(_id)) += Bar(None, "MyBarname", fooId) 
} yield (fooId, barId) 

db.run(insertDBIO.transactionally) 

transactionally通話將確保兩者都在運行相同的連接。

+0

最後我用了一個非常相似的方法,但並不知道事務性。真棒。工作順利! –