数据库 – 如何使用Slick的映射表与外键?
|
我正在努力解决Slick提升的嵌入和映射表格问题. API对我来说很奇怪,也许只是因为它的构造方式对我来说不熟悉. 我想构建一个Task / Todo-List.有两个实体: >任务:每个任务都有一个对下一个任务的可选引用.这样就构建了一个链表.目的是用户可以按其优先级排序任务.此顺序由任务到任务的引用表示. case class Task(id:Option [Long],title:String,nextTask:Option [Task]) 现在我尝试为这两个实体编写数据访问对象(DAO). import scala.slick.driver.H2Driver.simple._
import slick.lifted.MappedTypeMapper
implicit val session: Session = Database.threadLocalSession
val queryById = Tasks.createFinderBy( t => t.id )
def task(id: Long): Option[Task] = queryById(id).firstOption
private object Tasks extends Table[Task]("TASKS") {
def id = column[Long]("ID",O.PrimaryKey,O.AutoInc)
def title = column[String]("TITLE")
def nextTaskId = column[Option[Long]]("NEXT_TASK_ID")
def nextTask = foreignKey("NEXT_TASK_FK",nextTaskId,Tasks)(_.id)
def * = id ~ title ~ nextTask <> (Task,Task.unapply _)
}
private object TaskLists extends Table[TaskList]("TASKLISTS") {
def label = column[String]("LABEL",O.PrimaryKey)
def firstTaskId = column[Option[Long]]("FIRST_TASK_ID")
def firstTask = foreignKey("FIRST_TASK_FK",firstTaskId,Tasks)(_.id)
def * = label ~ firstTask <> (Task,Task.unapply _)
}
不幸的是它没有编译.问题出在nextTask和firstTask的两个表的*投影中. >找不到类型的证据参数的隐含值 我尝试使用以下TypeMapper来解决这个问题,但是也没有编译. implicit val taskMapper = MappedTypeMapper.base[Option[Long],Option[Task]](
option => option match {
case Some(id) => task(id)
case _ => None
},option => option match {
case Some(task) => task.id
case _ => None
})
>找不到参数tm的隐含值:scala.slick.lifted.TypeMapper [Option [justf0rfun.bookmark.model.Task]] 主要问题:如何以正确的方式使用Slick的提升嵌入和映射表?如何让这个工作? 提前致谢. 解决方法简短的回答是:使用id而不是对象引用,并使用Slick查询来取消引用ID.您可以将查询放入重用方法中.这将使您的案例类看起来像这样: case class Task(id: Option[Long],title: String,nextTaskId: Option[Long]) case class TaskList(label: String,firstTaskId: Option[Long]) 我将在某个时候发布一篇关于这个主题的文章并将其链接到这里. (编辑:南平站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

