Как определить отношение am: n с дополнительными атрибутами в 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)
}

Связь между 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

Есть идеи, как решить эту проблему?

5
задан Steffen 4 July 2011 в 13:10
поделиться