通用 table 光滑
Generic table with slick
我正在尝试创建一个通用的 table 摘要 class,我可以用它来表示集合并减少样板文件。
这是我的第一次尝试:
abstract class StringCollectionTable[A](tag: Tag,
name1: String, name2: String,
table: TableQuery[A], idMapper: A => Rep[Long])
extends Table[(Long, String)](tag, name1+"_"+name2) {
def id = column[Long]("ID_"+name1)
def item = column[String](name2)
def pk = primaryKey("pk_"+name1+"_"+name2, (id, item))
def idFK = foreignKey(name1 + "_FK", id, table)(idMapper, onUpdate=ForeignKeyAction.Restrict, onDelete=ForeignKeyAction.Cascade)
override def * : ProvenShape[(Long, String)] = (id, item)
}
它应该像这样使用:
case class Foo(...)
class FooTable(tag: Tag) extends Table[Foo](tag, "FOO") {...}
val foos = TableQuery[FooTable]
val mapToId = (t: TableQuery[FooTable]) => t.id
class FooBarTable(tag: Tag)
extends StringCollectionTable(tag, "FOO", "BAR", foos, mapToId)
因此,我可以存储与一个 foo 相关的一组条形值。
在 IntellJ IDEA 中这段代码似乎没问题。但是当我 运行 应用程序时,我收到错误消息:
inferred type arguments [slick.lifted.Rep[Long],Nothing,A,Nothing] do not conform to method foreignKey's type parameter bounds [P,PU,TT <: slick.lifted.AbstractTable[_],U]
行内:
def idFK = foreignKey(name1 + "_FK", id, table)(idMapper, onUpdate=ForeignKeyAction.Restrict, onDelete=ForeignKeyAction.Cascade)
我一直在搜索,但找不到问题所在。这是我的第一个 Slick 项目,我有点迷茫。
谁能告诉我正确的做法?
谢谢!
type 参数 A
应该是 Table
的子类型意味着 A <: Table[_]
像这样声明您的 StringCollectionTable
abstract class StringCollectionTable[A <: Table[_]](tag: Tag, ...) extends ... {
...
override def * = (id, item)
}
我正在尝试创建一个通用的 table 摘要 class,我可以用它来表示集合并减少样板文件。
这是我的第一次尝试:
abstract class StringCollectionTable[A](tag: Tag,
name1: String, name2: String,
table: TableQuery[A], idMapper: A => Rep[Long])
extends Table[(Long, String)](tag, name1+"_"+name2) {
def id = column[Long]("ID_"+name1)
def item = column[String](name2)
def pk = primaryKey("pk_"+name1+"_"+name2, (id, item))
def idFK = foreignKey(name1 + "_FK", id, table)(idMapper, onUpdate=ForeignKeyAction.Restrict, onDelete=ForeignKeyAction.Cascade)
override def * : ProvenShape[(Long, String)] = (id, item)
}
它应该像这样使用:
case class Foo(...)
class FooTable(tag: Tag) extends Table[Foo](tag, "FOO") {...}
val foos = TableQuery[FooTable]
val mapToId = (t: TableQuery[FooTable]) => t.id
class FooBarTable(tag: Tag)
extends StringCollectionTable(tag, "FOO", "BAR", foos, mapToId)
因此,我可以存储与一个 foo 相关的一组条形值。
在 IntellJ IDEA 中这段代码似乎没问题。但是当我 运行 应用程序时,我收到错误消息:
inferred type arguments [slick.lifted.Rep[Long],Nothing,A,Nothing] do not conform to method foreignKey's type parameter bounds [P,PU,TT <: slick.lifted.AbstractTable[_],U]
行内:
def idFK = foreignKey(name1 + "_FK", id, table)(idMapper, onUpdate=ForeignKeyAction.Restrict, onDelete=ForeignKeyAction.Cascade)
我一直在搜索,但找不到问题所在。这是我的第一个 Slick 项目,我有点迷茫。
谁能告诉我正确的做法?
谢谢!
type 参数 A
应该是 Table
的子类型意味着 A <: Table[_]
像这样声明您的 StringCollectionTable
abstract class StringCollectionTable[A <: Table[_]](tag: Tag, ...) extends ... {
...
override def * = (id, item)
}