Grails中object.get()与object.read()的优点

Grails中object.get()与object.read()的优点,grails,gorm,read-write,Grails,Gorm,Read Write,我浏览了一些Grails文档,发现了Grails中的read()方法。如果我理解正确,您可以从数据库中提取对象的“只读”版本,该对象只能通过显式调用save()保存。在我看来,每当您有一个不希望更改的对象时,就应该使用read()调用 但是为什么不总是使用read()调用呢?由于如果您save()无论如何都会将对象更改为读/写权限,那么只读取对象而不是获取对象是否会更安全?您可能是正确的-在大多数情况下是等效的。但是Hibernate不要求您调用save(),因为它在刷新期间执行脏检查,而且由于

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


但是为什么不总是使用
read()
调用呢?由于如果您
save()
无论如何都会将对象更改为读/写权限,那么只读取对象而不是获取对象是否会更安全?

您可能是正确的-在大多数情况下是等效的。但是Hibernate不要求您调用
save()
,因为它在刷新期间执行脏检查,而且由于Grails使用“视图中打开的会话”拦截器,所以在每个请求结束时都会有刷新。这让那些在由
get()
检索的实例中进行更改的人感到惊讶,这些更改本来只是在呈现视图时临时进行的,但是这些更改在没有
save()
调用的情况下仍然会被持久化
read()
在这种情况下更有意义


一种性能优化是仅将更改的字段推送到数据库。默认情况下,无论字段是否更改,都会推送所有字段,因为不需要为每次更新生成新的SQL。如果您
read()
实例Hibernate没有保留原始数据,因此无法进行动态更新,因为无法知道哪些字段是脏的。

因此,如果您读取()和对象并进行属性更改,并且整个会话被刷新,那么该对象将不会传播到数据库中,对吗?只有在显式调用该实例上的save()时,才会刷新该对象。这是正确的吗?正确-它基本上禁用自动刷新,但不禁用显式刷新