Slick: Обновления недоступны при получении сразу после - PullRequest
0 голосов
/ 28 мая 2018

Я пробовал этот отличный пример, и когда я пытаюсь создать запись, а затем получить ее сразу же, я не получаю запись.Я изменил тестовый пример, который здесь , как показано ниже.

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 голосов
/ 29 мая 2018

Это может быть связано с потерей содержимого базы данных в памяти после того, как create закрывает соединение.Согласно docs :

По умолчанию закрытие последнего подключения к базе данных закрывает базу данных.Для базы данных в памяти это означает, что содержимое потеряно.Чтобы оставить базу данных открытой, добавьте; DB_CLOSE_DELAY = -1 к URL базы данных.Чтобы сохранить содержимое базы данных в памяти, пока виртуальная машина жива, используйте jdbc: h2: mem: test; DB_CLOSE_DELAY = -1.

Однако после добавления DB_CLOSE_DELAY=-1,будут ошибки из-за

runscript from 'src/test/resources/schemadata.sql' 

, который выполняется для каждого соединения , поэтому рефакторинг необходим, так что база данных заполняется только один раз при инициализации.

...