我浏览了一些 Grails 文档,发现了一些关于read()
Grails 中的方法的信息。如果我理解正确,您可以从数据库中提取对象的“只读”版本,该版本仅在显式save()
调用时保存。在我看来,read()
只要您有一个您不希望更改的对象,您就应该使用调用。
但是你为什么不总是使用一个read()
电话呢?由于无论如何该对象将被更改为读/写权限save()
,因此仅读取对象而不是获取它不是更安全吗?
我浏览了一些 Grails 文档,发现了一些关于read()
Grails 中的方法的信息。如果我理解正确,您可以从数据库中提取对象的“只读”版本,该版本仅在显式save()
调用时保存。在我看来,read()
只要您有一个您不希望更改的对象,您就应该使用调用。
但是你为什么不总是使用一个read()
电话呢?由于无论如何该对象将被更改为读/写权限save()
,因此仅读取对象而不是获取它不是更安全吗?
你可能是对的 - 在大多数情况下它是等价的。但是 Hibernate 不需要您调用,save()
因为它在刷新期间会进行脏检查,并且由于 Grails 使用“Open Session in View”拦截器,因此在每个请求结束时总会有刷新。这让那些在通过该实例检索的实例中进行更改的人感到惊讶,get()
这意味着在呈现视图时只是临时的,但随后这些更改无论如何都会在没有save()
调用的情况下持续存在。read()
在那种情况下会更有意义。
一种性能优化是使用http://grails.org/doc/latest/ref/Database%20Mapping/dynamicUpdate.html仅将更改的字段推送到数据库。默认是推送所有字段,无论它们是否已更改,此后无需为每次更新生成新的 SQL。如果您read()
的实例 Hibernate 不保留原始数据,则无法进行动态更新,因为无法知道哪些字段是脏的。