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