2011-07-04 97 views
5

給定一個具有m:n關係的遺留數據庫和關係的一些附加屬性,它如何用squeryl定義。最後,表格應該如下所示:如何用Squeryl中的其他屬性定義m:n關係?

 

    +--------------+  +---------------+  +----------------+ 
    | TableA  |  | Rel_A_B  |  | TableB   | 
    +--------------+ ____ +---------------+ ____ +----------------+ 
    | id: Int  |  | tableA: int |  | compkey_1: int | 
    | (more attrs) |  | tableB_1: int |  | compkey_2: int | 
    +--------------+  | tableB_2: int |  | (more attrs) | 
         | value: Varchar|  +----------------+ 
         | date: Date | 
         +---------------+ 

Theres在用squeryl手動定義三個表格時沒有問題。然而,就我現在理解文檔(0.9.4)而言,不可能使用關係的附加屬性來定義多對多關係。

這就是爲什麼我定義了三個表和兩個一對多關係:


// TableA 
class TableA(val id: Int, ...) extends KeyedEntity[Int] { 
    def this() = this(0, ...) 
} 

// TableB 
class TableB(val compkey1: Int, val compkey2: Int, ...) 
     extends KeyedEntity[CompositeKey2[Int, Int]] { 

    def id = CompositeKey2(compkey1, compkey2) 
} 

// Rel_A_B 
class RelAB(val tabA: Int, val tabB1: Int, val tabB2: Int, val value: String, 
      val date: Date) extends KeyedEntity[CompositeKey3[Int, Int, Int]] { 

    def id = CompositeKey3(tabA, tabB1, tabB2) 
} 

可以很容易地定義表A和瑞萊博之間的關係。我使用普通的一對多關係:


val relA = 
    oneToManyRelation(tableA, relAB). 
    via((a, r) => a.id === r.tableA) 

但我沒有看到一種方法來定義第二個關係。我已經試圖定義的關係表(名爲compkeyB)額外的綜合值從tableB的只包含列,並將其與tableB的複合鍵,但這不起作用:


val relB = 
    oneToManyRelation(tableB, relAB). 
    via((b, r) => b.id === r.compkeyB) 

它拋出一個「類型不匹配」例外:

found : org.squeryl.dsl.ast.LogicalBoolean 
required: org.squeryl.dsl.ast.EqualityExpression 

任何想法如何解決這個問題?

+0

而不是(或更好,除),這表明了'tableA' /'relA'的東西方作品的代碼,你能不能包括產生異常的當前破碎的代碼? –

+0

@Damien:我添加了示例,它基本上與工作代碼相同,但使用CompositeKey2 vals,顯然不會導致EqualityExpression。 – Steffen

+0

我建議在squeryl郵件列表上發佈問題。 – Christian

回答

相關問題