2

在保存从客户端通过 JSON 发送的对象时,我有一个非常基本的问题。

我有一个客户对象,在编辑客户后将其发送回 Grails 并需要保存在数据库中。出于性能考虑,我不会通过网络发送完整的客户对象。

现在的问题是,如果我想存储客户对象,Grails 当然会验证客户对象的关系并失败。这没关系,因为我还没有发送关系。

我的问题是现在我该如何解决这个问题?我是否需要使用客户 ID 再次查询数据库并更新已编辑的属性,还是有更优雅的方法?从数据库的角度来看,这看起来有点贵,因为我每次存储对象时都需要读取数据库。同样从代码的角度来看,我需要检查设置了哪些属性并更新它们。

谢谢!

4

1 回答 1

3

您不能save()用于进行部分更新,因为 grails 无法猜测您实际想要更新哪些字段:也许您真的想将字段值设置为 NULL,因此 Grails 不能忽略这些字段。所以我看到了两个选择:

  1. 像你描述的那样做:从数据库加载实例,设置值并再次保存。您已经提到,您不喜欢关心更新了哪些字段,而只想获取 JSON 实例的所有属性。因此,假设调用了您已经解析的 JSON 实例jsonInstance并且您的客户数据库版本是customerInstance,您可以执行以下操作:

     jsonInstance.properties.each { field -> 
         customerInstance."${field.key}" = field.value
     }
    

    但是,请注意存在安全限制(如果攻击者将“id”属性或其他相关属性值注入其中,这些将被覆盖)。

  2. 使用executeUpdate-function,见: http ://www.grails.org/doc/latest/ref/Domain%20Classes/executeUpdate.html

    我想,如果你真的想节省性能,那就这样吧。但是,您有一些硬编码的 DML,这将降低可维护性和灵活性。

于 2011-08-15T11:55:57.163 回答