【发布时间】:2015-07-03 03:57:45
【问题描述】:
我想知道是否可以更改 Grails 域类中复合主键的 主键 成员的值?例如拥有这个域:
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时,更新它们工作正常(我尝试执行@987654331 @直接对数据库进行确认)。如何更新主键?
PS:现在,基于这种设计,我知道有些人会建议为什么不创建另一个记录,然后只获取上次输入的记录?但我需要做的是更新复合主键。
PPS:请不要建议删除旧实例,并创建一个新实例,复制除section 之外的旧详细信息。我不能这样做,因为很多表都连接到这个表。
【问题讨论】:
-
能否详细说明:“主键更新不生效”。你如何确认它没有生效?另外,能否请您说明一下上述代码是在服务还是控制器中。谢谢。 :)
-
@IStevenson 我在主要和非主要字段上执行了更新(在服务内),检查数据库是否有效。与更新非主字段相比,在 grails 上更新主字段不起作用。
标签: grails grails-orm