Как определить отношение am: n с дополнительными атрибутами в Squeryl? - PullRequest
5 голосов
/ 04 июля 2011

Учитывая устаревшую базу данных с отношением 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

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

1 Ответ

6 голосов
/ 05 июля 2011
...