Использование в Hibernate аннотаций @DynamicInsert и @DynamicUpdate для создания SQL инструкций вставки и обновления во время выполнения

Чтобы Hibernate не создавал SQL запросы на вставку и обновление строк заранее, на этапе запуска приложения, а делал это каждый раз во время непосредственно вставки/обновления, можно использовать аннотации @DynamicInsert и @DynamicUpdate.

Ставятся эти аннотации непосредственно над классом предметной области:

Поскольку эти аннотации не являются стандартными JPA аннотациями, а доступны только в Hibernate, то мы пишем их полное имя.

Какую проблему решает данный подход

Допустим есть следующий класс предметной области:

Во время старта приложения Hibernate создаст для этой сущности (как минимум) четыре SQL запроса (обычный CRUD), чтобы не тратить вычислительные мощности на их создание во время выполнения. Выглядеть они будут примерно следующим образом.

Выборка:

Удаление:

Вставка:

Обновление:

У операций вставки и обновления в этих примерах просматривается особенность. Если мы хотим создать такие SQL заранее, то мы должны упомянуть в них сразу все поля. Причём в реальности и для вставки, и для обновления у нас могут быть данные не для всех полей. Особенно это актуально для обновления. Мы хотим, например, обновить всего одно поле, но в запросе указываем все поля, заново вставляя в них те же данные, которые там уже есть.

В ситуациях, когда те или иные таблицы имеют много полей и активно используются, такой подход может существенно сказаться на производительности приложения. Использование аннотаций @DynamicInsert и @DynamicUpdate закрывает эту проблему, заставляя Hibernate формировать соответствующий SQL запросы на вставку и обновление на лету во время исполнения, задействуя только те поля, которые реально используются.