給定一個具有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
任何想法如何解決這個問題?
而不是(或更好,除),這表明了'tableA' /'relA'的東西方作品的代碼,你能不能包括產生異常的當前破碎的代碼? –
@Damien:我添加了示例,它基本上與工作代碼相同,但使用CompositeKey2 vals,顯然不會導致EqualityExpression。 – Steffen
我建議在squeryl郵件列表上發佈問題。 – Christian