2011-07-04 23 views
5

M: n bağıntısı ve ilişki için bazı ek özniteliklere sahip eski bir veritabanı verildiğinde, bu durum karsılık ile nasıl tanımlanabilir. Sonunda tablolar gibi görünmelidir:Squeryl'de ek öznitelikler ile m: n ilişkisi nasıl tanımlanır?

 

    +--------------+  +---------------+  +----------------+ 
    | 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 hiçbir sorun squeryl ile manuel üç tablo tanımlanmasında. Bununla birlikte, şu andaki dokümantasyonu anladığım kadarıyla (0.9.4) ilişki için ek özniteliklerle çoktan çoğa ilişkisi tanımlamak mümkün değildir.

Ben üç tablo ve iki bire çok ilişki tanımlanmış nedeni şudur:


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

Bu TableA ve RelAB arasındaki ilişkiyi tanımlamak kolaydır. Ben sıradan bir çoğa ilişkisi kullanın:


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

Ama ikinci ilişkiyi tanımlamak için bir yol göremiyorum. Zaten TABLEB sadece sütunları içeren (compkeyB adında) ilişkisi masaya ilave bir kompozit değer tanımlayan ve TABLEB kompozit anahtarına karşılaştırmak çalıştı, ancak bu işe yaramazsa:


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

Bir atar "tür uyuşmazlığı" özel durumu:

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

Bunu nasıl çözeceğiniz konusunda herhangi bir fikrin var mı?

Bu sınırlama tarafından ısırılan edilir
+0

, yapabildin istisna üreten mevcut kırık kod içerir? –

+0

@Damien: Örneği ekledim, temelde çalışma koduyla aynı ancak bir EqualityExpression'a yol açmayan CompositeKey2 vals kullanıyor. – Steffen

+0

Soruyu squeryl posta listesine göndermenizi tavsiye ederim. – Christian

cevap

İlgili konular