2011-07-04 11 views
5

m:nの関係を持つレガシーデータベースと、リレーションのいくつかの追加の属性がある場合、どのようにこれをsquerylで定義できます。最後にテーブルは次のようになります。Squerylの追加属性とm:nの関係を定義する方法は?

3つのテーブルを手動で定義しても問題はありません。しかし、私が現時点でのドキュメント(0.9.4)を理解している限り、関係の追加属性を使用して多対多の関係を定義する可能性はありません。

私は3つのテーブルと2つの1対多の関係に定義理由です:それはテーブルAとRelABとの間の関係を定義するのは簡単です


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

を。


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

しかし、私は2番目の関係を定義する方法はありません。私はすでにTABLEBからちょうど列を含む(compkeyBという名前の)関係テーブルに追加の合成値を定義し、テーブルBの複合キーと比較してみましたが、これは動作しません:


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

よりもむしろ(またはそれに加えて)は、あなたの可能性例外を生成している現在の壊れたコードを含めますか? –

+0

@Damien:サンプルを追加しました。基本的には作業コードと同じですが、CompositeKey2のvalを使用しています。これは明らかにEqualityExpressionにつながりません。 – Steffen

+0

質問をsquerylメーリングリストに投稿することをお勧めします。 – Christian

答えて

6

:物事の `tableA` /` relA`側のために動作するコードを示す

http://www.assembla.com/spaces/squeryl/tickets/25-compositekeys-cannot-be-the-binding-expression-for-relations

+0

この回答をありがとう、私はすでに公開された問題を検索しましたが、明らかに私はこれを見落としました。 – Steffen

+0

既知の回避策はまだありますか?私は各テーブルの2つの列でOneToMany関連するテーブルを持っています。 – Gabriel

関連する問題