26

我浏览了一些 Grails 文档,发现一些关于read()Grails 中的方法的信息。如果我理解正确,您可以从数据库中提取对象的“只读”版本,该版本仅在显式save()调用时保存。在我看来,read()只要您有一个您不希望更改的对象,您就应该使用调用。

但是你为什么不总是使用一个read()电话呢?由于无论如何该对象将被更改为读/写权限save(),因此仅读取对象而不是获取它不是更安全吗?

4

1 回答 1

22

你可能是对的 - 在大多数情况下它是等价的。但是 Hibernate 不需要您调用,save()因为它在刷新期间会进行脏检查,并且由于 Grails 使用“Open Session in View”拦截器,因此在每个请求结束时总会有刷新。这让那些在通过该实例检索的实例中进行更改的人感到惊讶,get()这意味着在呈现视图时只是临时的,但随后这些更改无论如何都会在没有save()调用的情况下持续存在。read()在那种情况下会更有意义。

一种性能优化是使用http://grails.org/doc/latest/ref/Database%20Mapping/dynamicUpdate.html仅将更改的字段推送到数据库。默认是推送所有字段,无论它们是否已更改,此后无需为每次更新生成新的 SQL。如果您read()的实例 Hibernate 不保留原始数据,则无法进行动态更新,因为无法知道哪些字段是脏的。

于 2012-07-09T19:46:34.990 回答