更新 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: 1
的 studentNumber: "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
和status
时,更新它们工作正常(我尝试直接在数据库上执行 SQL
以确认)。如何更新主键?
PS: 现在,基于这个设计,我知道有些人会建议为什么不创建另一条记录,然后只获取最后一条记录进入?但是我需要做的是更新复合主键。
PPS: 请不要建议删除旧实例,创建一个新实例,复制旧的细节,除了 section
.我不能那样做,因为很多 table 都连接到这个 table.
我认为避免更改主键是一种很好的做法。主键是一个对象的唯一标识符,有效地改变它意味着创建一个新的对象。因此,如果您的复合主键是可变的(或可以变异),那么您应该使用代理键——一个人工主键。同时,您可以在当前作为主键的 4 个字段上创建唯一约束。
你的情况是:
static mapping = {
...
}
static constraints = {
studentNumber(unique: ["schoolYear", "yearLevel", "section"])
}
希望它有意义。
我想知道是否可以更改 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: 1
的 studentNumber: "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
和status
时,更新它们工作正常(我尝试直接在数据库上执行 SQL
以确认)。如何更新主键?
PS: 现在,基于这个设计,我知道有些人会建议为什么不创建另一条记录,然后只获取最后一条记录进入?但是我需要做的是更新复合主键。
PPS: 请不要建议删除旧实例,创建一个新实例,复制旧的细节,除了 section
.我不能那样做,因为很多 table 都连接到这个 table.
我认为避免更改主键是一种很好的做法。主键是一个对象的唯一标识符,有效地改变它意味着创建一个新的对象。因此,如果您的复合主键是可变的(或可以变异),那么您应该使用代理键——一个人工主键。同时,您可以在当前作为主键的 4 个字段上创建唯一约束。
你的情况是:
static mapping = {
...
}
static constraints = {
studentNumber(unique: ["schoolYear", "yearLevel", "section"])
}
希望它有意义。