首页 > 解决方案 > 如何在 Grails 3 的编辑视图中修改 ID 列(或列)的值?

问题描述

在 Grails 3 中,如何允许在运行时修改 ID 列的值?就我而言,我有一个包含三列的复合主键的表。我手动指定它们出现在编辑视图中,我的update()方法代码如下所示:

@Transactional
def update(AliasFrequencyDict aliasFrequencyDict) {

    aliasFrequencyDict = AliasFrequencyDict.get( new AliasFrequencyDict(params) )

    if (aliasFrequencyDict == null) {
        notFound()
        return
    }

    aliasFrequencyDict.properties = params

    try {
        aliasFrequencyDict.save(insert: false, flush: true)
    } catch (ValidationException e) {
        respond aliasFrequencyDict.errors, view:'edit'
        return
    }

    request.withFormat {
        form multipartForm {
            flash.message = message(code: 'default.updated.message', args: [message(code: 'aliasFrequencyDict.label', default: 'AliasFrequencyDict'), aliasFrequencyDict.getPK()])
            redirect(action: 'show', params: params)
        }
        '*'{ respond aliasFrequencyDict, [status: OK] }
    }
}

...并且当我进入编辑视图并编辑不属于键的属性时,它会正确保存,但是一旦我更改其他属性之一,我就会收到一条消息,指出 Grails 找不到 AliasFreuqencyDict 的实例标识为空。我想问题在于,一旦您更改了其中一列,ID 也会发生变化,并且 Grails 不知何故不知道如何从对象曾经拥有的主键切换到新的主键。

那么,我应该如何修改控制器以允许编辑部分键列呢?

标签: grailsgrails-ormgrails-controllergrails3

解决方案


这里(最明显的)问题是您查找要更新的内容的方式。如果您共享您的域模型,AliasFrequencyDict我可以更具体一些,但假设您有一个 and 的复合键FirstLast一个 where 的实例[first:"John", last:"Doe"]

现在您将其更新为设置first=Jane并按下更新...您正在AliasFrequencyDict为“Jane Doe”创建一个新的并在 的查找中使用它.get(),当然这不会返回AliasFrequencyDict. 如果要更改 PK 字段的值,则需要传入旧值以查找对象,然后相应地设置新值。


推荐阅读