内部操作不会在浮动内部执行

时间:2018-05-27 10:57:31

标签: scala playframework slick

我有要求我必须在书表中插入并根据生成的自动ID,我必须插入bookModules表。对于每个bookModule自动增量ID,我必须插入bookAssoc表。但是使用seq [bookMods]填充bookModule,并使用Seq [userModRoles]填充bookAssociation数据。

我已经编写了下面的代码来实现这一点,但它只执行action1。我的内心行为没有得到执行。请帮我 。

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:添加代码以进行comphrension

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 :(得分:0)

您需要将逻辑分为两部分。

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移动到Dao类。在这里,可能是你应该为Futures工作的服务。

抱歉,如果我在括号中犯了一些错误,但在这里很难清楚地说明一切:)