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