如何在Squeryl中定义m:n与其他属性的关系?

时间:2011-07-04 11:32:11

标签: database-design scala squeryl

给定具有m:n关系的遗留数据库以及该关系的一些附加属性,如何使用squeryl定义。最后,表格应如下所示:


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

使用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)
}

很容易定义TableA和RelAB之间的关系。我使用普通的一对多关系:


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

任何想法如何解决这个问题?