【问题标题】:Benefits of object.get() vs object.read() in GrailsGrails 中 object.get() 与 object.read() 的优势
【发布时间】:2012-07-09 04:27:39
【问题描述】:

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

但是你为什么不总是使用read() 调用呢?因为如果你 save() 无论如何该对象将被更改为读/写权限,那么只读取对象而不是获取它不是更安全吗?

【问题讨论】:

    标签: grails grails-orm read-write


    【解决方案1】:

    您可能是正确的 - 在大多数情况下它是等价的。但是 Hibernate 不需要您调用 save(),因为它会在刷新期间进行脏检查,并且由于 Grails 使用“在视图中打开会话”拦截器,因此在每个请求结束时总会有刷新。这让那些在get() 检索到的实例中进行更改的人感到惊讶,这些更改在呈现视图时只是暂时的,但是在没有save() 调用的情况下无论如何都会保留更改。 read() 在这种情况下会更有意义。

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

    【讨论】:

    • 因此,如果您读取()和对象并进行属性更改并且整个会话被刷新,那么该对象将不会传播到数据库对吗?只有当您在该实例上显式调用 save() 时,该对象才会被刷新。这是正确的吗?
    • 正确 - 它基本上禁用自动刷新,但不禁用显式刷新
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多