如何使用GORM创建复合主键?

hay*_*uhl 5 indexing grails grails-orm composite-primary-key

我有三个域类:Beer,Review和Reviewer.

我希望Review表在Beer和Reviewer之间创建多对多关系,因此我希望Review的主键是Beer和Reviewer的id字段的组合.我正在关注这个Grails文档.

http://grails.org/doc/latest/guide/5.%20Object%20Relational%20Mapping%20(GORM).html#5.5.2.5%20Composite%20Primary%20Keys

这是我的域类.

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']
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到了编译错误,但是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)
Run Code Online (Sandbox Code Playgroud)

我只对具有唯一约束的复合索引感到满意,但我也无法弄清楚如何做到这一点.我已经能够创建一个非唯一的复合索引,但这有两个问题.一,它不是唯一的.二,列在索引中按字母顺序指定(beer_id,reviewer_id).我想指定索引中列的顺序.

z.e*_*yyo 0

试试这个,在您的域中查看域类:

static constraints = {
     review(unique: ['beer','reviewer'])
}
Run Code Online (Sandbox Code Playgroud)

您可能需要删除该表并让 Gorm 重新创建它。

上述限制意味着评论必须包含啤酒/评论者组合的唯一记录。它仍然是多对多的,评论者有多种啤酒,反之亦然,但评论是独一无二的。