Ich versuche, eine generische Tabelle abstrakte Klasse zu erstellen, die ich verwenden kann, um Sammlungen darzustellen und zu reduzieren.Generische Tabelle mit Slick
Dies ist mein erster Versuch:
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)
}
Und es suposed wird wie verwendet werden:
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)
mit dieser So kann ich eine Sammlung von Bar-Werte speichern mit einem foo bezogen.
In IntellJ IDEA scheint dieser Code in Ordnung zu sein. Aber wenn ich die app laufen bekomme ich den Fehler:
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]
In Zeile:
def idFK = foreignKey(name1 + "_FK", id, table)(idMapper, onUpdate=ForeignKeyAction.Restrict, onDelete=ForeignKeyAction.Cascade)
Ich habe einige Suche getan und ich kann das Problem nicht finden. Es ist mein erstes Slick-Projekt und ich bin ein bisschen verloren.
Kann mir jemand sagen, wie das geht?
Danke!
It "Werk" mit [A <: AbstractTable [_]], ich eine neue Fehlermeldung erhalten: Keine passende Form gefunden. Slick kann die angegebenen Typen nicht zuordnen. Mögliche Ursachen: T in Tabelle [T] stimmt nicht mit Ihrer * Projektion überein. Oder Sie verwenden einen nicht unterstützten Typ in einer Abfrage (z. B. scala-Liste). Voraussetzung: slick.lifted.FlatShapeLevel Quelle Typ: A Entpackte Typ: U Typ Verpackt: Alle –
@AlejandroTrujilloCaballero def * zu definiert richtig – pamu
ist definiert als 'außer Kraft setzen def *: ProvenShape [(Long, String)] = (id, item) 'Ich kann das Problem in dieser Zeile nicht sehen –