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

2024-01-06

我有三个领域类: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 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']
    }
}

我收到编译错误,但 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)

我很乐意使用具有唯一约束的复合索引,但我也不知道如何做到这一点。我已经能够创建一个非唯一的复合索引,但这有两个问题。第一,它不是唯一的。第二,索引中按字母顺序指定列(beer_id、reviewer_id)。我想指定索引中列的顺序。


我已经实现了类似的情况,但有一些不同的条件:

  1. 没有hasMany关系。
  2. 对join类的查询是通过HQL完成的
  3. 使用更详细的映射

这样实现的时候,mysql数据库就ok了。 (beer_id,reviewer_id) 是主键。

class Review implements Serializable {

    Beer beer
    Reviewer reviewer

    static Review get(long beerId, long reviewerId) {
        find 'from Review where beer.id=:beerId and reviewer.id=:reviewerId',
            [beerId: beerId, reviewerId: reviewerId]
    }

    static boolean remove(Beer beer, Reviewer reviewer, boolean flush = false) {
        Review instance = Review.findByBeerAndReviewer(beer, reviewer)
        instance ? instance.delete(flush: flush) : false
    }
    ...

    static mapping = {
        table "REVIEW"
        id composite: ['beer', 'reviewer']
        beer(column: "beer_ID")
        reviewer(column: "reviewer_ID")
        version false
    }
}

我不知道到底是什么原因导致了您的问题,但希望这能给您一些有关问题所在的提示。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 GORM 创建复合主键? 的相关文章

随机推荐