executeUpdate более эффективно, если размер и количество необновленных полей велики (и это субъективно). Именно поэтому я тоже часто удаляю экземпляры, выполняя команду «delete from Foo, где id = 123», поскольку мне кажется расточительным загружать экземпляр полностью, просто вызывая для него delete ().
Если в вашем доменном классе есть большие строки и вы используете подход get () и save (), то вы без необходимости сериализуете все эти данные из базы данных на веб-сервер дважды, когда все, что вам нужно изменить, это одно поле.
Эффект на кэш 2-го уровня необходимо учитывать, если вы используете его (и если вы много редактируете экземпляры, то, вероятно, не должны). С executeUpdate он сбрасывает все экземпляры, ранее загруженные с помощью get (), но если вы обновите с помощью get + save, если сбрасывает только этот один экземпляр. Это ухудшается, если вы кластеризуетесь, поскольку после executeUpdate вы очищаете все кэши узлов кластера, а не очищаете один экземпляр на всех узлах.
Лучше всего сравнить оба подхода. Если вы не перегружаете базу данных, возможно, вы преждевременно оптимизируете, и лучше всего использовать стандартный подход, чтобы сохранить простоту при решении других проблем.