【问题标题】:Update method doesn't save to database in Grails更新方法不会保存到 Grails 中的数据库
【发布时间】:2023-03-30 12:25:01
【问题描述】:

我正在尝试编写一个自定义控制器,它允许我在 Grails 3.3.8 中处理带有复合键的表。我有一个这样的表称为AliasFrequencyDict,所以我在控制器中创建了一个这样的方法:

@Transactional
def update(AliasFrequencyDict aliasFrequencyDict) {

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

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

    try {
        aliasFrequencyDict.save(insert: false, flush: true, failOnError: 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] }
    }
}

这似乎应该可以工作 - 当我在编辑视图中更改某些内容并提交时,我被正确重定向到 show 操作,我收到通知更新成功的 flash 消息,URL 是 http://localhost:8080/aliasFrequencyDict/show?_method=PUT&version=&frequency=0&unit=Q&description=abc123&lang=PL,并且但是数据库本身的记录没有任何变化。为什么呢?这里可能有什么问题?

【问题讨论】:

  • 你的项目在 github 上可用吗?有助于查看此处发生的其他事情,例如getPK()
  • @MikeW - 不是,很遗憾,我认为这不可能,因为我在公司环境中这样做,所以我认为我不能完整地展示它: (至于这里的问题,不过加一行aliasFrequencyDict.properties = params好像就解决了问题!
  • 我希望你在那里得到 404,因为我认为 AliasFrequencyDict.get( new AliasFrequencyDict(params) ) 永远不会找到匹配的记录。也许AliasFrequencyDict 中有一些东西会让这更有意义,但乍一看我不确定这是什么意图。
  • 我之前的评论假定您的 notFound() 方法当然返回 404。
  • @JeffScottBrown - 但这并没有导致 404,恰恰相反 - “成功更新”消息。原来罪魁祸首是我没有像上面提到的那样明确地将参数写入属性。 .get() 查找记录的方法基于文档中的此条目:docs.grails.org/3.0.2/guide/GORM.html#compositePrimaryKeys(正如我所提到的,我在这里使用复合主键)

标签: java grails orm grails-orm grails3


【解决方案1】:

好的,事实证明问题比看起来更简单 - 在保存之前将参数显式写入属性就足以解决它!所以我们只需这样做:

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

aliasFrequencyDict.properties = params /* <===== here! */

try {
    aliasFrequencyDict.save(insert: false, flush: true)
...

...它的工作原理!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-25
    • 2020-06-09
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 2013-03-02
    相关资源
    最近更新 更多