gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:21:59 25 4
gpt4 key购买 nike

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

我遇到了编译错误,但是 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)。我想指定索引中列的顺序。

最佳答案

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

  • 没有 hasMany关系。
  • 对连接类的查询由 HQL 完成
  • 使用更详细的映射

  • 这样实现的时候,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
    }
    }

    我不知道究竟是什么导致了您的问题,但希望这能给您一些有关问题可能出在哪里的提示。

    关于grails - 如何使用 GORM 创建复合主键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5502628/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com