我有要求我必须在书表中插入并根据生成的自动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)
答案 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工作的服务。
抱歉,如果我在括号中犯了一些错误,但在这里很难清楚地说明一切:)