Slick:刚刚获取后更新不可用

时间:2018-05-28 03:39:14

标签: scala h2 slick scalatest

我正在尝试this光滑的示例,当我尝试创建一个条目然后立即获取该条目时,我没有得到记录。我修改了here的测试用例,如下所示。

val response = create(BankProduct("car loan", 1)).flatMap(getById)
whenReady(response) { p =>
  assert(p.get === BankProduct("car loan", 1))
}

上述操作失败,因为无法立即获取创建的BankProduct。 它正在使用h2 db,以下是配置。

trait H2DBComponent extends DBComponent {

  val logger = LoggerFactory.getLogger(this.getClass)

  val driver = slick.driver.H2Driver

  import driver.api._

  val randomDB = "jdbc:h2:mem:test" + UUID.randomUUID().toString() + ";"

  val h2Url = randomDB + "MODE=MySql;DATABASE_TO_UPPER=false;INIT=runscript from 'src/test/resources/schema.sql'\\;runscript from 'src/test/resources/schemadata.sql'"

  val db: Database = {
    logger.info("Creating test connection")
    Database.forURL(url = h2Url, driver = "org.h2.Driver")
  }
}


private[repo] trait BankProductTable extends BankTable { this: DBComponent =>

  import driver.api._

  private[BankProductTable] class BankProductTable(tag: Tag) extends Table[BankProduct](tag, "bankproduct") {
    val id = column[Int]("id", O.PrimaryKey, O.AutoInc)
    val name = column[String]("name")
    val bankId = column[Int]("bank_id")
    def bank = foreignKey("bank_product_fk", bankId, bankTableQuery)(_.id)
    def * = (name, bankId, id.?) <> (BankProduct.tupled, BankProduct.unapply)

  }

  protected val bankProductTableQuery = TableQuery[BankProductTable]

  protected def bankProductTableAutoInc = bankProductTableQuery returning bankProductTableQuery.map(_.id)

}

我不明白为什么会这样,以及如何避免这种情况? 我尝试添加了autoCommit但也没有用。

感谢任何帮助以澄清这种含糊之处。

1 个答案:

答案 0 :(得分:1)

这可能是由于create调用关闭其连接后内存数据库内容丢失。根据{{​​3}}:

  

默认情况下,关闭与数据库的最后一个连接会关闭   数据库。对于内存数据库,这意味着内容丢失。   要使数据库保持打开状态,请将DB_CLOSE_DELAY = -1添加到数据库URL。   保持内存数据库的内容与虚拟内容一样长   机器处于活动状态,使用jdbc:h2:mem:test; DB_CLOSE_DELAY = -1。

但是,添加DB_CLOSE_DELAY=-1后,由于

会出现错误
runscript from 'src/test/resources/schemadata.sql' 

docs,因此重构是必要的,这样数据库在初始化时只填充一次。