Ответ 1
Вероятно, вы правы - в большинстве случаев это было бы эквивалентно. Но Hibernate не требует, чтобы вы вызывали save()
, поскольку он выполняет грязную проверку во время флеша, и поскольку Grails использует перехватчик "Open Session in View", в конце каждого запроса всегда будет флеш. Это удивляет людей, которые вносят изменения в экземпляр, полученный с помощью get()
, который должен был быть временным только при рендеринге представления, но затем изменения все равно сохраняются без вызова save()
. read()
будет иметь больше смысла в этом сценарии.
Одна оптимизация производительности заключается в использовании http://grails.org/doc/latest/ref/Database%20Mapping/dynamicUpdate.html только для ввода измененных полей в базу данных. Значение по умолчанию заключается в том, чтобы вытолкнуть все поля независимо от того, были ли они изменены или нет, с тех пор нет необходимости генерировать новый SQL для каждого обновления. Если вы read()
, экземпляр Hibernate не сохраняет исходные данные, поэтому динамическое обновление было бы невозможным, так как не было способа узнать, какие поля загрязнены.