2016-09-21 3 views
0

こんにちは私は単純な問題があります。 私のドメインクラスは、このようなものです:Grails:単純なhasMany関係は、必要以上のテーブルを作成する

class Example { 

    long seq 

    hasMany = [example_array: ExampleData] 

    long count 
} 

class ExampleData { 

    String type 

    long description 

    static belongsTo = Example 

    static constraints = { 
    } 
} 

これは、多くの関係に多くのように、3つのテーブルになります。 これはなぜですか?

static belongsTo = [example:Example] 

はそれが役に立てば幸い:)

答えて

0

ジョインテーブルとのこの種の関係。あなたが言及した3番目のテーブルです。それについて心配する必要はありません。

+0

いいえ、 'belongsTo'に' Map'を割り当てる必要はありません。あなたは 'Map'か' Class'を割り当てることができます。 'Map'を使うと、' belongsTo'を定義しているクラスにバックリファレンスが追加されます。 'Class'を使うと、それは起こりません。 http://docs.grails.org/3.1.11/ref/Domain%20Classes/belongsTo.htmlを参照してください。 –

+0

'Map'を使うと、スキーマは異なっていて、それはあなたが望むものかもしれませんが、' Map'を使う必要はありません。 –

+0

元気ですが、彼は3番目のテーブルを削除したいと考えています。 Burt Beckwithは良い言葉で説明しました。 –

0

hasManyのGrailsのの定義からだろう、デフォルトでは、マップ:私はあなたがこのように、belongsToのをマップするために持っていることを信じてい

おかげ

0

ウェルをone-to-many relationshipは、二つの列の関係(すなわちExampleExampleData)を形成するエンティティのテーブルから各idフィールドを含む(すなわち、Example_ExampleData)追加のテーブルを備えて構成されています。

新しく追加されたテーブルは、子テーブルから親テーブルです(ExampleおよびExampleData)。

アプリケーションを実行するときに、テーブル関係がone-to-many relationshipになると、3番目のテーブルはデフォルトでGrailsによって作成されます。

1

余分なテーブルの理由は、あなたが一方向にのみ関係をモデル化してきたということである - なぜならhasManyプロパティのクラスのバイトコードに追加されますexample_arrayセットを介してそのExampleDataインスタンスにアクセスすることができExampleが、ExampleDataインスタンスその所有物を参照する方法がありませんExample

belongsToプロパティを追加しましたが、クラス名のみを指定しました。所有権、カスケードされた削除などを設定するには十分ですが、クラス内でExampleインスタンスにアクセスするプロパティは提供されません。

あなたが期待どおりにはそれが動作する他のサポートされている構文に変更した場合:

static belongsTo = [example: Example] 

ここexampleExampleプロパティの名前になってしまうだろう(そして、あなたはそれを変更することができ、および/またはexample_arrayへ基本的には双方が相互にアクセスできることを今

Example example 

の宣言と同じである任意の有効なプロパティ名)が、関係は双方向であり、あなたは、もはや第三のテーブルを必要としません。なぜなら、1-manyは通常、子テーブル内の外部キーを使用して実装されているからです。この場合は、Exampleのテーブルを指すExampleDataのテーブルにあります。クラス内のプロパティがその列まで配線されていなければ、これは不可能であったため、結合テーブルが必要でした。

関連する問題