2013-02-28 4 views
9

Slick, 상속 테이블 모델에 쿼리를 매핑하는 방법은 무엇입니까? 즉,Slick, 상속 테이블 모델에 쿼리를 매핑하는 방법은 무엇입니까?

내가, B는 C A가 & C는 "아이"테이블에있는 "부모"테이블과 B 테이블 A는 한 내가 알고 싶은 것은 내가 너무 매끄러운 유언장을 사용하여이 모델링하는 방법입니다 추상적이고 B & 콘크리트 유형이고 A에서 행을 쿼리하면 B 또는 C 객체가됩니다.

JPA의 InheritanceType.TABLE_PER_CLASS과 같은 것입니다.

+2

슬릭은 _not_ ORM입니다! 상속이있는 ORM 종류의 모델을 기반으로 스키마를 설계 한 경우 Slick에서 사용하려고 할 때 전체 임피던스 부정합 문제를 역으로 가져올 것입니다. –

+6

ORM이 아닌 것으로 알고 있습니다. ,하지만 당신에게 어떤 형태의 행을 제공하는 프레임 워크를 위해서 <-> 객체 매핑, 나는 상속의 그러한 경우가 어디로 데려 갔는지 궁금하다. –

답변

9

에서보세요. 먼저 계층 구조를 테이블에 매핑하는 방법을 찾습니다. 이 경우 유형을 저장하는 열을 사용하고 있습니다. 하지만 다른 트릭도 사용할 수 있습니다.

이제
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 
} 
+0

좋은 해결책, 명확한 대답! 공유해 주셔서 감사합니다. – RoyB

0

슬릭은 이것을 직접적으로 지원하지 않습니다. 일부 데이터베이스는 상속에 도움이 될 수 있으므로 원하는 효과에 가까운 것을 얻을 수 있어야합니다.

우리는 사물의 몇해야 할 inheritance documentation in PostgreSQL