grails - 如何在 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 不知何故不知道如何从对象曾经拥有的主键切换到新的主键。
那么,我应该如何修改控制器以允许编辑部分键列呢?
解决方案
这里(最明显的)问题是您查找要更新的内容的方式。如果您共享您的域模型,AliasFrequencyDict
我可以更具体一些,但假设您有一个 and 的复合键First
和Last
一个 where 的实例[first:"John", last:"Doe"]
。
现在您将其更新为设置first=Jane
并按下更新...您正在AliasFrequencyDict
为“Jane Doe”创建一个新的并在 的查找中使用它.get()
,当然这不会返回AliasFrequencyDict
. 如果要更改 PK 字段的值,则需要传入旧值以查找对象,然后相应地设置新值。
推荐阅读
- python - win32gui.FindWindow - 屏幕截图循环未在特定窗口上更新
- java - DrawerLayout 标题的变化
- javascript - CPU 使用率占整个系统的百分比?
- next.js - 如何在柏树中存根 getServerSideProps?
- css - 如何将滚动条保持在模式弹出窗口的顶部
- windows - 如何将命令提示符屏幕高度限制更改为 9999 以上?
- ionic-framework - 如何使用 UPI Deep Link 在 IONIC 4 中仅打开部分 UPI 应用程序
- javascript - D3:如何创建自定义的倾斜色标?
- arrays - 尝试展开或忽略行
- spring - 为什么H2找不到spring.datasource.schema中定义的schema脚本?