Grails Gorm Partial Save

时间:2011-08-14 15:28:54

标签: grails grails-domain-class

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

我有一个客户对象转移到客户端,在编辑客户后将其发送回Grails并需要保存在数据库中。为了提高性能,我没有通过网络发送完整的客户对象。

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

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

谢谢!

1 个答案:

答案 0 :(得分:3)

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

  1. 按照您的描述进行操作:从DB加载实例,设置值并再次保存。您已经提到过,您不想关心哪些字段已更新,您只想获取JSON实例的所有属性。因此,假设已经解析的JSON实例名为jsonInstance且客户的数据库版本为customerInstance,则可以执行以下操作:

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

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

  2. 使用executeUpdate - 功能,请参阅: http://www.grails.org/doc/latest/ref/Domain%20Classes/executeUpdate.html

    我认为,如果你真的想保存性能,那么就这样吧。但是,你有一些硬编码的DML,这将耗费可维护性和灵活性。