2011-07-04 57 views
5

给定一个具有m:n关系的遗留数据库和关系的一些附加属性,它如何用squeryl定义。最后,表格应该如下所示:如何用Squeryl中的其他属性定义m:n关系?

 

    +--------------+  +---------------+  +----------------+ 
    | 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在用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) 
} 

可以很容易地定义表A和瑞莱博之间的关系。我使用普通的一对多关系:


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 

任何想法如何解决这个问题?

+0

而不是(或更好,除),这表明了'tableA' /'relA'的东西方作品的代码,你能不能包括产生异常的当前破碎的代码? –

+0

@Damien:我添加了示例,它基本上与工作代码相同,但使用CompositeKey2 vals,显然不会导致EqualityExpression。 – Steffen

+0

我建议在squeryl邮件列表上发布问题。 – Christian

回答

相关问题