Ste*_*fen 5 database-design scala squeryl
给定具有am: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)
}
Run Code Online (Sandbox Code Playgroud)
定义TableA和RelAB之间的关系很容易.我使用普通的一对多关系:
val relA =
oneToManyRelation(tableA, relAB).
via((a, r) => a.id === r.tableA)
Run Code Online (Sandbox Code Playgroud)
但我没有看到定义第二种关系的方法.我已经尝试在关系表(名为compkeyB)上定义一个额外的复合值,其中只包含tableB中的列,并将其与tableB的复合键进行比较,但这不起作用:
val relB =
oneToManyRelation(tableB, relAB).
via((b, r) => b.id === r.compkeyB)
Run Code Online (Sandbox Code Playgroud)
它会引发"类型不匹配"异常:
found : org.squeryl.dsl.ast.LogicalBoolean
required: org.squeryl.dsl.ast.EqualityExpression
Run Code Online (Sandbox Code Playgroud)
任何想法如何解决这个问题?
| 归档时间: |
|
| 查看次数: |
564 次 |
| 最近记录: |