【问题标题】:Updating a primary key value on grails gorm在 grails gorm 上更新主键值
【发布时间】: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)

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


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


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

【问题讨论】:

  • 能否详细说明:“主键更新不生效”。你如何确认它没有生效?另外,能否请您说明一下上述代码是在服务还是控制器中。谢谢。 :)
  • @IStevenson 我在主要和非主要字段上执行了更新(在服务内),检查数据库是否有效。与更新非主字段相比,在 grails 上更新主字段不起作用。

标签: grails grails-orm


【解决方案1】:

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

在你的情况下是:

static mapping = {
   ...
}

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

希望它有意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 2017-06-15
    • 1970-01-01
    相关资源
    最近更新 更多