2011-07-04 18 views
5

Dada una base de datos heredada con una relación m: n y algunos atributos adicionales para la relación, ¿cómo se puede definir esto con squeryl. Al final las tablas deben tener este aspecto:¿Cómo se define una relación m: n con atributos adicionales en 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 | 
         +---------------+ 

Theres ningún problema en la definición de las tres tablas manualmente con squeryl. Sin embargo, por lo que entiendo la documentación en este momento (0.9.4) no hay posibilidad de definir una relación muchos a muchos con atributos adicionales para la relación.

Es por eso que he definido tres mesas y dos relaciones de uno a muchos:


// 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) 
} 

Es fácil definir la relación entre TableA y RELAB. Uso una relación uno a varios ordinaria:


val relA = 
    oneToManyRelation(tableA, relAB). 
    via((a, r) => a.id === r.tableA) 

Pero no veo una manera de definir la segunda relación. Ya he intentado definir un valor compuesto adicional en la tabla de relación (llamado compkeyB) que contiene sólo las columnas de la Tabla B y compararlo con la clave compuesta de TableB, pero esto no funciona:


val relB = 
    oneToManyRelation(tableB, relAB). 
    via((b, r) => b.id === r.compkeyB) 

que arroja una "tipo no coincide" excepción:

found : org.squeryl.dsl.ast.LogicalBoolean 
required: org.squeryl.dsl.ast.EqualityExpression 

¿Alguna idea de cómo solucionar esto?

+0

En lugar de (o mejor, además de) muestra el código que trabaja para el tableA'/'' relA' lado de las cosas, ¿verdad incluir el código roto actual que está produciendo la excepción? –

+0

@Damien: Agregué la muestra, básicamente es la misma que el código de trabajo pero usando CompositeKey2 vals, que obviamente no conduce a una EqualityExpression. – Steffen

+0

Recomiendo publicar la pregunta en la lista de correo de squeryl. – Christian

Respuesta

Cuestiones relacionadas