更新grails gorm上的主键值

时间:2015-07-03 03:57:46

标签: grails gorm

我想知道我是否可以在Grails Domain类中更改复合主键的主键成员的值?例如,拥有此域名:

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)

中执行类似的操作
average

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

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

PPS:请不要建议删除旧实例,并创建一个新实例,复制除LAMA以外的旧详细信息。我不能这样做,因为很多表都连接到这个表。

1 个答案:

答案 0 :(得分:1)

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

在你的情况下,它将是:

static mapping = {
   ...
}

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

希望它有意义。