считывание идентификатора автоинкремента без запуска db.run и без него для понимания в Slick в одной транзакции - PullRequest
0 голосов
/ 28 мая 2018

Мне нужно вставить в таблицу и, основываясь на идентификаторе возврата, вставить в другие таблицы.Невозможно запустить для понимания как в коллекции Scala, так и в DBCollection.

 def savebook(book: Book, bookReaders: Seq[BookReaders]) = {
  val transformedBookReaders = Seq[BookReaders]()
  val action1 = bookDAO.insertRow(book).map { id =>
    transformedBookReaders :+ bookReaders.map { bookReader=> new BookAssociation(None, id, bookReader.moduleId, bookReader.userId, bookReader.roleId) }
  }
  val action2 = bookAssocDao.insertRows(transformedBookReaders )
  db.run(action1.andThen(action2).transactionally)
}

Мое второе действие - не вставлять строки.

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Мое требование состояло в том, чтобы выполнить код транзакции без базы данных для понимания.Мне нужно перебрать коллекцию scala, пока я выполняю код транзакции БД для понимания.

Я нашел одну ссылку (http://virtuslab.slides.com/pdolega/slick-101#/94), которая очень хорошо объясняет, как выполнить код транзакции без базы данных для понимания с помощью DBIO.successful

 def saveBook(book: Book, bookModules: Seq[BookModule]) = {
    def createBookModuleMapping(bookId: Int) = {
      bookModules.map { bookModule =>
        new bookModule(None, bookId, bookModule.moduleId, bookModule.isActive)
      }
    }

    val action1 = for {
      bookId<-bookDao.insert(book)
      bookModule <- DBIO.successful(createBookModuleMapping(bookId))
      ids <- bookModuleDao.insertRows(bookModule)
    } yield ()

    db.run(action1.transactionally)

  }
0 голосов
/ 28 мая 2018

Если action1 не был запущен во время создания action2, то transformedBookReaders будет пустым и ничего не произойдет.Если бы вы могли изменить action, чтобы получить коллекцию BookReader вместо зависимости от побочных эффектов, тогда можно было бы построить action2

def savebook(book: Book, bookReaders: Seq[BookReaders]) = {
  val action1 = bookDAO.insertRow(book).map { id =>
    bookReaders.map { bookReader=> new BookAssociation(None, id, bookReader.moduleId, bookReader.userId, bookReader.roleId)
  }
  val action2 = readers => bookAssocDao.insertRows( readers )
  db.run(action1.andThen(action2).transactionally)
}

. Возможно, я неправильно понял, что insertRow() и insertRows()делаем.

...