【发布时间】:2017-06-06 02:10:17
【问题描述】:
我在play 框架中这样做是为了使用slick 获取命令和执行表之间的关系。
class ExecutionsTable(tag: Tag) extends BaseTable[Execution](tag, "executions") {
def name = column[String]("name")
def execution = column[String]("execution")
def commandId = column[Long]("command_id")
def * = (id, name, execution, commandId) <> (Execution.tupled, Execution.unapply)
def command = foreignKey("commands", commandId, commandsTableQ)(_.id)
implicit val CommandToLong = MappedColumnType.base[Long, Command] (
id => {
val cmd = Await.result(new CommandsDAO().findById(id), 1 second)
cmd.get
},
cmd => cmd.id
)
findById 返回Future[Option[Command]] 我正在尝试使用这种方法,但我不确定它是否是最好的解决方案。
你会推荐什么?
【问题讨论】:
-
嗯。我没有一个好的答案,但这对我来说看起来很危险。作为一般规则,
Await应该被视为 Play 内部的毒药——它破坏了线程设计,并且只有在您知道自己在做什么时才应该使用。 (而.get有神秘崩溃的风险。)你真的需要自定义Command类型吗?我同情对它的渴望(我假设您在这里将它用于外键关系?),但这段代码看起来可能会在生产中引起微妙的问题...... -
我在 Slick gitter 频道中被建议不要执行此实现,因为它依赖于 Future 结果并且对于 MappedColumnType 它没有好的解决方案。我被建议做一个完整的 SQL 查询
标签: scala playframework slick