5

给定一个具有 am:n 关系和一些附加属性的旧数据库,如何用 squeryl.xml 定义它。最后,表格应如下所示:

   +---------------+ +----------------+ +---------------- +
   | 表A | | 相对A_B | | 表B |
   +--------------+ ____ +----------------+ ____ +-------------- --+
   | 编号:诠释 | | 表A:整数| | compkey_1: 整数 |
   | (更多属性) | | 表 B_1:整数 | | compkey_2: 整数 |
   +--------------+ | 表 B_2:整数 | | (更多属性) |
                         | 值:varchar| +----------------+
                         | 日期:日期 |
                         +---------------+

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

但我看不到定义第二个关系的方法。我已经尝试在仅包含 tableB 中的列的关系表(名为 compkeyB)上定义一个附加复合值,并将其与 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

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

4

1 回答 1

6

你被这个限制所困扰:

http://www.assembla.com/spaces/squeryl/tickets/25-compositekeys-cannot-be-the-binding-expression-for-relations

于 2011-07-05T06:52:31.307 回答