如何在Groovy / Grails中正确保存对域对象的更新

时间:2019-04-19 18:44:37

标签: grails groovy persistence gorm

我开始接触我组织的Groovy / Grails后端,并负责更新User域对象上的Document。问题是,在使用附加了正确参数的前端访问更新端点后,后端将使用未更改的Document对象进行响应。

代码如下:

 if (requestParams.userEmail) {
    def contact = User.findByEmail(requestParams.userEmail)
    log.debug('Reading user found by passed email contact={} error={}',contact, contact.errors.allErrors.inspect())

    if (!contact) {
       response.status = 400
       render WebserviceError.badInput as JSON
       return
    }

    document.user = contact
    document.user.save(flush: true)
 }
 document.save(flush: true)
 render survey as JSON

前端返回一个Promise,并且我正在记录Promise响应,它显示了一个具有相同附加用户的不变Document对象。我没有收到400,因此看来已成功找到联系人。

我尝试将flush:true添加到user.save调用和document.save调用中,但这没有帮助。

我的代码中是否存在明显的错误行为?

3 个答案:

答案 0 :(得分:0)

好的db操作应该使用@Transactional在服务中,而不是在控制器中,最好是gorm版本而不是spring版本。您不需要使用flush:true。然后从服务中返回您可以返回到控制器的服务,并以JSON形式呈现。

答案 1 :(得分:0)

您没有声明在服务器上看到表明已找到用户的调试语句,也许实际上并没有进入本节?

我认为提供的代码不完整,因为我们看不到返回的survey包含正在更新的document。括号看起来也不平衡,好像存在控制流问题。 (即为什么有2个开括号但3个闭括号?)

我建议您在代码上使用调试器,以查看控件的实际流动方式。大多数Java IDE支持简单的调试,实际上是单击调试按钮而不是运行按钮。通过该代码设置一些断点,以捕获请求并从您的前端调用API端点。

答案 2 :(得分:0)

文档是父母吗?要孩子吗?

User.addTodocument(someUser)

然后Document.merge()