更新 grails gorm 上的主键值

Updating a primary key value on grails gorm

我想知道是否可以更改 Grails 域 class 中复合主键的 主键 成员的值?例如有这个域:

class StudentHistory implements Serializable {
    String studentNumber
    String schoolYear
    Integer yearLevel
    String section
    Float average
    String status

    static mapping = {
        ...
        id composite: ["studentNumber", "schoolYear", "yearLevel", "section"]
        ...
    }
}

假设,在 schoolYear: "2014-2015" 上,某个 yearLevel: 1studentNumber: "2011-488-MN-0" 学生从 section: "1D" 转到了 section: "1N"。现在要执行此记录更新,我们在 service:

中执行类似的操作
StudentHistory record = StudentHistory.find {
    eq("studentNumber", "2014-488-MN-0")
    eq("schoolYear", "2014-2015")
    eq("yearLevel", 1)
    eq("section", "1D")
}

record.setSection("1N")

record.save(flush: true, insert: false)

问题是主键的更新没有生效,但是当我尝试更新其他非主字段如averagestatus时,更新它们工作正常(我尝试直接在数据库上执行 SQL 以确认)。如何更新主键?


PS: 现在,基于这个设计,我知道有些人会建议为什么不创建另一条记录,然后只获取最后一条记录进入?但是我需要做的是更新复合主键


PPS: 请不要建议删除旧实例,创建一个新实例,复制旧的细节,除了 section.我不能那样做,因为很多 table 都连接到这个 table.

我认为避免更改主键是一种很好的做法。主键是一个对象的唯一标识符,有效地改变它意味着创建一个新的对象。因此,如果您的复合主键是可变的(或可以变异),那么您应该使用代理键——一个人工主键。同时,您可以在当前作为主键的 4 个字段上创建唯一约束。

你的情况是:

static mapping = {
   ...
}

static constraints = {
   studentNumber(unique: ["schoolYear", "yearLevel", "section"])
}

希望它有意义。