에서보세요. 먼저 계층 구조를 테이블에 매핑하는 방법을 찾습니다. 이 경우 유형을 저장하는 열을 사용하고 있습니다. 하지만 다른 트릭도 사용할 수 있습니다.
이제
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"))
})
}
}
다음 당신이 할 수있는 특정 하위 유형을 확인하려면 :
Query(new MyTable).foreach {
case ChildOne(a, b, c) => //childone
case ChildTwo(a, b, d) => childtwo
}
슬릭은 _not_ ORM입니다! 상속이있는 ORM 종류의 모델을 기반으로 스키마를 설계 한 경우 Slick에서 사용하려고 할 때 전체 임피던스 부정합 문제를 역으로 가져올 것입니다. –
ORM이 아닌 것으로 알고 있습니다. ,하지만 당신에게 어떤 형태의 행을 제공하는 프레임 워크를 위해서 <-> 객체 매핑, 나는 상속의 그러한 경우가 어디로 데려 갔는지 궁금하다. –