Внутренние действия не выполняются внутри транзакции в слике - PullRequest
0 голосов
/ 27 мая 2018

У меня есть требование, где я должен вставить в таблицу книги и на основе автоматически сгенерированного идентификатора, я должен вставить в таблицу bookModules. Для каждого идентификатора автоинкремента bookModule, я должен вставить в таблицу bookAssoc.Но bookModule заполняется с помощью seq [bookMods], а данные bookAssociation заполняются с помощью Seq [userModRoles].

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

val action1 =bookDao.insert(book)

  val action2 = action1.map { id => DBIO.sequence(
      bookMods.map { bookMod => 
        bookModDao.insert(new bookModule(None, id, bookMod.moduleId, bookMod.isActive))
          .map { bookModId =>
            userModRoles.map { userModRole =>
              bookAssocDao.insert(new bookAssociation(None, bookModId, userModRole.moduleId, userModRole.roleId))


            }
          }

      })

    }

 db.run(action2.transactionally)

РЕДАКТИРОВАТЬ 1: Добавление кода для понимания

val action1 = for{
    bookId<-bookDao.insert(book) // db transaction
    bookMod<-bookModules// this is scala collection // Iterate each element and Insert into  tables
    bookModId<-bookModDao.insert(new bookModule(None, bookId, bookMod.moduleId, bookMod.isActive))
    userModRole<-userModRoles //// this is scala collection // Iterate each element and Insert into  tables
    bookAssocDao.insert(new bookAssociation(None, bookModId, userModRole.moduleId, userModRole.roleId))

  }yield()

   db.run(action2.transactionally)

1 Ответ

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

Вам нужно разделить логику на две части.

1) DBIO

2) выполняет итерации по коллекциям.

В этом случае решение должно быть простым.Но без использования для понимания.

bookModules.map{ bookMod =>
    userModRoles.map{ userModRole =>
        db.run(bookDao.insert(book).flatMap{ bookId =>
            bookModDao.inser(new bookModule(None, bookId, bookMod.moduleId, bookMod.isActive)).map{ bookModId =>
                bookAssocDao.insert(new bookAssociation(None, bookModId, userModRole.moduleId, userModRole.roleId))
            }
         }).transactionally
    }
}

Попробуйте что-то вроде этого.Он должен работать.Вы можете подумать о том, чтобы перенести db.run в классы Дао.И здесь, вероятно, это сервис, который вы должны работать на Futures.

И извините, если я ошибаюсь с круглыми скобками, но здесь трудно все прояснить:)

...