我在保存通过JSON发送的客户端获取的对象时有一个非常基本的问题。
我有一个客户对象转移到客户端,在编辑客户后将其发送回Grails并需要保存在数据库中。为了提高性能,我没有通过网络发送完整的客户对象。
现在的问题是,如果我想存储客户对象,Grails当然会验证客户对象的关系并失败。这没关系,因为我没有发送关系。
我的问题是现在如何解决这个问题?我是否需要使用客户ID再次查询数据库并更新已编辑的属性,还是有更优雅的方式?从数据库角度来看,这看起来有点贵,因为每次存储对象时我都需要读取数据库。从代码角度来看,我需要检查设置了哪些属性并更新它们。
谢谢!
答案 0 :(得分:3)
您不能使用save()
进行部分更新,因为grails无法猜测您实际想要更新的字段:可能您真的想要将字段值设置为NULL,因此Grails不能忽略这些字段。所以我看到两个选择:
按照您的描述进行操作:从DB加载实例,设置值并再次保存。您已经提到过,您不想关心哪些字段已更新,您只想获取JSON实例的所有属性。因此,假设已经解析的JSON实例名为jsonInstance
且客户的数据库版本为customerInstance
,则可以执行以下操作:
jsonInstance.properties.each { field ->
customerInstance."${field.key}" = field.value
}
但请注意,存在安全限制(如果攻击者将“id”属性或其他相关属性值注入其中,则会覆盖这些属性值。)
使用executeUpdate
- 功能,请参阅:
http://www.grails.org/doc/latest/ref/Domain%20Classes/executeUpdate.html
我认为,如果你真的想保存性能,那么就这样吧。但是,你有一些硬编码的DML,这将耗费可维护性和灵活性。