让我们说我希望在我的所有案例类中都有一个ID columen,我会用光滑的:
abstract class BaseEntity(val _id:Option[Long])
case class SomeEntity(id:Option[Long],value:String) extends BaseEntity(id)
现在让我们定义方案的抽象类和一个真正的方案:
abstract class BaseScheme[A <: BaseEntity](tag:Tag,name:String) extends Table[A](tag,name) {
def id = column[Long]("ID",O.PrimaryKey,O.AutoInc)
}
class SomeEntityScheme(tag:Tag) extends BaseScheme[SomeEntity](tag,"SOME_NAME") {
def value = column[String]("value",O.NotNull)
def * = (id.?,value) <> (SomeEntity.tupled,SomeEntity.unapply)
}
val someEntitiesTable = TableQuery[SomeEntityScheme]
既然我以为我厌倦了编写AutoIncInsert方法,我会创建一个通用方法,这就是我不知所措的时刻:
object BaseScheme {
def autoIncInsert[T <: BaseScheme[_]] (t : TableQuery[T]) = t returning t.map(_.id) into {case (p,id) => p.copy(id = Some(id))}
}
当然还有问题的输出:
[error] /home/tomaszk/Projects/4.4/mCloud/application/service-execution/execution-provisioning-model/src/main/scala/pl/mlife/mcloud/provisioning/database/schemes/ExcludingServicesScheme.scala:48: could not find implicit value for evidence parameter of type scala.slick.ast.TypedType[T#TableElementType]
[error] def remap[T <: BaseScheme[_]] (t : TableQuery[T]) = t returning t.map(_.id) into {case (p,id) => p.copy(id = Some(id))}
[error] ^
[error] one error found
答案 0 :(得分:1)
我可能用你的方法,我没有足够的知识说它不能,但听起来有点腥和过于复杂。我所做的是使用我使用here的相同方法,即定义一个方法,该方法采用T#TableElementType
(可能是行对象)和TableQuery
对象并执行一些通用操作:
def autoIncInsert[T <: BaseScheme[_]](row: T#TableElementType, tableReference: TableQuery[T])(implicit s: Session) = {
(tableReference returning tableReference.map(_.id)) += row
}
然后作为T
类型,您应该通过SomeEntityScheme
类。
在我看来,这应该以更简洁,更简单的方式解决你的问题。