2011-08-04 11 views
1

多対多リレーションシップを調整するために、grailsで関連テーブルを作成する方法について質問があります。 1.ドメインA(クライアントプロファイル)は多くのドメインB(フレンド) を持つことができます。2.各ドメインB(フレンド)は多くのドメインA(クライアントプロファイル)を持つことができます 3.これを解決するには、各テーブルからFKを持つAssociativeテーブル(またはドメイン)を作成します。Grailsドメイン作成関連テーブル

class DomainA{ 
    String id 
String firstName 
String lastName 
    static hasMany = [domainB: DomainB] 
    static mapping = { 
    cache true 
    id generator: 'assigned' 

    columns { 
     firstName type:'text' 
     lastName type:'text' 
     alumConnections column: 'domaina_id', joinTable: 'a_b' 
    } 

} 
static constraints = { 
    firstName (nullable:true) 
    lastName (nullable:true) 
} 

    } 

DomainBのコード:

class DomainB{ 
String id 
String firstName 
String lastName 

    static hasMany = [domainA:DomainA] 
static belongsTo = DomainA 
static mapping = { 
    cache true 
    id generator: 'assigned'   

      columns {     
     firstName  type:'text' 
     lastName  type:'text' 
     domainA column: 'domainb_id', joinTable: 'a_b' 
    } 
} 
static constraints = { 
    firstName  (nullable:true) 
    lastName  (nullable:true) 

} 
    } 

ドメインA_Bコード:

class AB{ 


Date dateCreated 
Date lastUpdated 
long version 

    } 
このドメインは

ここで私がこれまで持っているコードは、ドメインC(client_friend)と命名することができます

このコードを実行すると、動作するようです。 MySQLを使用したテーブルが作成され、FKが適切に配置されているようです。 DomainBクラスにデータを入力すると、データが入力され、DomainAとDomainBの両方のPKがA_Bに挿入されます。しかし、A_Bから値を削除しようとすると問題が発生します。私はこのような何か試してみた:

 AB results =AB.findByAIdAndBId('jIi-hRi4cI','2BYvuA2X14') 

をが、エラーを取得:InvalidPropertyException:名前が見つかりませんプロパティ[A_ID]クラスの[クラスmgr.AB]

は、私の質問はこれです:最初に、持っています私はこれを正しく設定しましたか?第二に、もしそうなら、どのようにして私はABテーブルを照会するのですか?PKはDomainAとDomainBの複合体で構成されていますか?

ありがとうございました。

jason

答えて

1

あなたの複合クラスは完全ではありません。この例を見てそれに応じて調整してください。これは私のすべての複合ドメインをどのように行うのかです。

これを済ませたら、belongsToとhasManyの関連付けは必要ありません。しかし、これらのドメインからのデータにアクセスするには、次のような方法を提供することができます:

class User { 

    // typical domain junk 

    Set<Role> getAuthorities() { 
    UserRole.findAllByUser(this).collect { it.role } as Set 
    } 
} 

その後、あなたはhasManyのがあったかのようにuserInstance.authoritesのようなものを行うことができます。基本的に、あなたはGrailsが典型的なことをしています。しかし、これは実際には良いことです。 Grailsのコレクションは、正しく行われなければコストがかかることがあります。これは、2.0ではバッグを使用して解決されています。

+0

ありがとうございます。私の例では、DomainAとDomainBはどうですか?私は彼らの「所属」と「たくさんある」を取り除く必要がありますか? – jason

+0

はい、それらは必要ありません。私はそれをどう扱うかを反映するように答えを更新します。 – Gregg

+0

ありがとう、私はこれらの変更を実装し、どのように動作するかを見てみましょう! – jason

関連する問題