Chúng tôi cần thực hiện một số việc. Đầu tiên hãy tìm cách để ánh xạ hệ thống phân cấp tới một bảng. Trong trường hợp này tôi đang sử dụng một cột lưu trữ loại. Nhưng bạn cũng có thể sử dụng một số thủ thuật khác.
trait Base {
val a: Int
val b: String
}
case class ChildOne(val a: Int, val b: String, val c: String) extends Base
case class ChildTwo(val a: Int, val b: String, val d: Int) extends Base
class MyTable extends Table[Base]("SOME_TABLE") {
def a = column[Int]("a")
def b = column[String]("b")
def c = column[String]("c", O.Nullable)
def d = column[Int]("d", O.Nullable)
def e = column[String]("model_type")
//mapping based on model type column
def * = a ~ b ~ c.? ~ d.? ~ e <> ({ t => t match {
case (a, b, Some(c), _, "ChildOne") => ChildOne(a, b, c)
case (a, b, _, Some(d), "ChildTwo") => ChildTwo(a, b, d)
}}, {
case ChildOne(a, b, c) => Some((a, b, Some(c), None, "ChildOne"))
case ChildTwo(a, b, d) => Some((a, b, None, Some(d), "ChildTwo"))
})
}
}
Bây giờ để xác định loại phụ cụ thể mà bạn có thể làm như sau:
Query(new MyTable).foreach {
case ChildOne(a, b, c) => //childone
case ChildTwo(a, b, d) => childtwo
}
Slick là _not_ một ORM! Nếu bạn có một lược đồ được thiết kế xung quanh một loại ORM của mô hình với thừa kế, bạn có thể sẽ nhận được toàn bộ trở ngại mis-match vấn đề ngược lại khi bạn cố gắng sử dụng nó trong Slick ... –
Tôi biết nó không phải là một ORM , nhưng đối với một khung cung cấp cho bạn một số hình thức của hàng <-> ánh xạ đối tượng, tôi tự hỏi nếu trường hợp thừa kế đó được đưa vào xem xét –