2013-02-28 13 views
9

Slick, cách ánh xạ truy vấn đến mô hình bảng kế thừa? tức,Slick, làm thế nào để ánh xạ một truy vấn đến một mô hình bảng kế thừa?

Tôi đã bảng A, B, C A là "cha mẹ" bảng và B & C là "trẻ em" bảng Những gì tôi muốn biết là làm thế nào tôi nên mô hình này sử dụng khéo léo để Di chúc trừu tượng và B & C loại bê tông và truy vấn cho một hàng trong A sẽ dẫn đến đối tượng B hoặc C

Thứ gì đó giống như của JPA InheritanceType.TABLE_PER_CLASS.

+2

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 ... –

+6

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 –

Trả lời

9

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

Giải pháp tốt, câu trả lời rõ ràng! Cảm ơn vì đã chia sẻ. – RoyB

0

Slick không hỗ trợ trực tiếp điều này. Một số cơ sở dữ liệu có thể giúp bạn với thừa kế, vì vậy bạn sẽ có thể nhận được một cái gì đó gần với hiệu quả mong muốn.

Hãy xem qua số inheritance documentation in PostgreSQL