Beer、Review、および Reviewer の 3 つのドメイン クラスがあります。
Review テーブルで Beer と Reviewer の間に多対多の関係を作成する必要があるため、Review の主キーを Beer と Reviewer の id フィールドの合成にする必要があります。私はこのGrailsのドキュメントに従っています。
これが私のドメインクラスです。
class Beer {
String name
String type
Brewery breweryId
static hasMany = [ reviews : Review ]
static constraints = {
}
}
class Reviewer {
String screenName
static hasMany = [ reviews : Review ]
static constraints = {
}
}
class Review implements Serializable {
int score
Beer beer
Reviewer reviewer
static constraints = {
}
static mapping = {
id composite:['beer', 'reviewer']
}
}
コンパイル エラーが発生していましたが、stackoverflow に関する別の回答では、追加する必要があるとのことでしたimplements Serializable
。これでエラーは解決しましたが、データベースを見ると、複合主キーがまだ取得されていません。
テーブル定義を見ると、次のようになります。Postgresを使用しています。
Table "public.review"
Column | Type | Modifiers
-------------+---------+-----------
id | bigint | not null
version | bigint | not null
beer_id | bigint | not null
reviewer_id | bigint | not null
score | integer | not null
Indexes:
"review_pkey" PRIMARY KEY, btree (id)
Foreign-key constraints:
"fkc84ef75823f39326" FOREIGN KEY (beer_id) REFERENCES beer(id)
"fkc84ef7587c483106" FOREIGN KEY (reviewer_id) REFERENCES reviewer(id)
一意の制約を持つ複合インデックスだけで満足しますが、その方法もわかりません。一意ではない複合インデックスを作成できましたが、これには 2 つの問題があります。1つ、それはユニークではありません。2 つ目は、列がインデックス (beer_id、reviewer_id) でアルファベット順に指定されていることです。インデックス内の列の順序を指定したいと思います。