Как изменить значение столбца ID (или столбцов) в представлении редактирования в Grails 3?

Как разрешить изменение значений столбцов ID во время выполнения в Grails 3? В моем случае у меня есть таблица с составным первичным ключом, состоящим из трех столбцов. Я вручную указал, что они должны отображаться в режиме редактирования, и мой код метода 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 для Идентификатор нулевой. Я предполагаю, что проблема заключается в том, что, как только вы измените один из таких столбцов, идентификатор также изменится, и Grails каким-то образом не знает, как переключиться с первичного ключа, который раньше был у объекта, на новые.

Как мне тогда изменить контроллер, чтобы разрешить редактирование столбцов части ключа?


person Straightfw    schedule 01.03.2019    source источник


Ответы (1)


(Наиболее очевидная) проблема здесь заключается в том, как вы ищете тот, который хотите обновить. Если вы поделитесь своей моделью домена для AliasFrequencyDict, я могу быть более конкретным, но скажем, что у вас есть составной ключ из First и Last и экземпляр, где [first:"John", last:"Doe"].

Теперь вы обновляете его, чтобы установить first=Jane, и нажимаете «Обновить»… вы создаете новый AliasFrequencyDict для «Jane Doe» и используете его для поиска .get(), конечно, это не вернет экземпляр AliasFrequencyDict. Если вы меняете значение поля PK, вам нужно передать старые значения для поиска объекта, а затем соответствующим образом установить новые значения.

person Trebla    schedule 05.03.2019