Slick - Einsatz foreignKey-constraint und Zugriff auf referenzierte Objekt direkt als Spalte
Ich habe zwei Modelle (sagen, Lieferanten und Kaffee) und Kaffee-Modell hat die foreign-key-Referenz auf Lieferant Modell. Während ddl, dass ich diese Beziehung bestehen in der Erstellung der Tabelle. Aber ich möchte auch die Möglichkeit zu verweisen, die Anbieter-Objekt-durch Kaffee-Objekts wie coffeeObj.supplier.name
. Unten ist mein dummy-code. Ich bin mit MappedTable, foreignKey und TypeMapper.
import scala.slick.driver.H2Driver.simple._
import Database.threadLocalSession
object SlickTest {
//Supplier
case class Supplier(id: Option[Int], name: String)
object Suppliers extends Table[Supplier]("supplier") {
def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
def name = column[String]("name")
def * = id.? ~ name <> (Supplier, Supplier.unapply _)
def findOneById(id: Int): Supplier =
this.map { e => e }.where(r => r.id === id).firstOption.get
}
//Implicit Conversion from Supplier to Int
implicit val supTypeMapper = MappedTypeMapper.base[Supplier, Int](
{ s => s.id.get }, { id => Suppliers.findOneById(id) })
//Coffee
case class Coffee(name: Option[String], sup: Supplier, price: Double)
object Coffees extends Table[Coffee]("coffee") {
def name = column[String]("cof_name", O.PrimaryKey)
def sup = column[Supplier]("supplier")
def price = column[Double]("price")
def * = name.? ~ sup ~ price <> (Coffee, Coffee.unapply _)
def supplier = foreignKey("SUP_FK", sup, Suppliers)(_.id)
}
}
Den code scheitert an der letzten Zeile für die definition von supplier
. Könnte jemand alle vergossen Licht?
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Slick, die Sie nicht anzeigen zu Fall Klassen, die Verweise auf andere Fall-Klassen. Zu beheben, fremde Schlüssel, die Sie verwenden, Abfragen statt, die in Methoden für die re-usability.
Siehe auch meine post an: https://groups.google.com/d/msg/scalaquery/esFb2DjoHVE/NtMj7BmpE94J
EDIT:
Sie kann nicht Folgen, eine Referenz in coffeeObj und das ist eine gute Sache. Denn das würde erfordern, konfigurieren Sie einen laden Strategie wie in ORMs, das wäre komplizierter und würde das ausführungsverhalten des Codes weniger offensichtlich.
Lazy loading würde wahrscheinlich laden die coffeeObj in der Steuerung und der Lieferant in der Ansicht, die seltsam erscheint, richtig? Sie können dies tun:
Entfernen
.firstOption.get
von IhremfindOneById
Methode und dann:Legen Sie die Verknüpfung in eine Funktion zu speichern Textbaustein.
coffeeObj.supplier.name
?TableQuery[Suppliers]
stattQuery(Suppliers)
im Slick-0.8