Учитывая устаревшую базу данных с отношением 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
Есть идеи, как решить эту проблему?