2016-09-14 3 views
0

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!

Antwort

0

Typ Parameter A sollte Subtyp von Table sein A <: Table[_]

impliziert Erklären Sie Ihre StringCollectionTable ähnliche

abstract class StringCollectionTable[A <: Table[_]](tag: Tag, ...) extends ... { 
    ... 
    override def * = (id, item) 
} 
+0

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 –

+0

@AlejandroTrujilloCaballero def * zu definiert richtig – pamu

+0

ist definiert als 'außer Kraft setzen def *: ProvenShape [(Long, String)] = (id, item) 'Ich kann das Problem in dieser Zeile nicht sehen –