Какие значения может принимать hibernate.hbm2ddl.auto и что они делают?
Полный разбор hibernate.hbm2ddl.auto
Этот параметр управляет автоматическим созданием/изменением схемы БД на основе ваших JPA-сущностей. Доступно 5 стандартных значений:
none— ничего не делать (по умолчанию в чистом Hibernate без Spring Boot)validate— только проверка соответствияupdate— обновление схемы (добавление новых таблиц/колонок)create— удаление и создание заново при стартеcreate-drop— создание при старте, удаление при остановке
Детальное описание каждого режима
1. none
Hibernate полностью игнорирует управление схемой. Вы сами отвечаете за создание таблиц через SQL-скрипты или миграции (Flyway, Liquibase).
spring.jpa.hibernate.ddl-auto=none
2. validate
При старте приложения Hibernate проверяет, что существующие таблицы соответствуют вашим сущностям. Если найдено несоответствие (например, в сущности есть поле email, а в таблице его нет) — выбрасывается исключение SchemaManagementException.
// Пример сущности
@Entity
public class User {
@Id
private Long id;
private String email; // если колонки email нет в БД — ошибка при старте
}
Этот режим безопасен для продакшена — он не вносит изменений, только проверяет.
3. update
Hibernate автоматически добавляет новые таблицы, колонки и ограничения, но никогда не удаляет существующие. Если вы переименовали поле в сущности — старая колонка останется, новая добавится.
// Было: private String name;
// Стало: private String fullName;
// Результат: в БД появятся обе колонки: name и full_name
Подходит для разработки, но опасен для продакшена — может случайно создать лишние индексы или изменить типы данных.
4. create
При каждом запуске Hibernate удаляет все таблицы, связанные с сущностями, и создаёт их заново. Все данные теряются.
spring.jpa.hibernate.ddl-auto=create
Используйте только для прототипирования или тестов. Настоятельно не рекомендуется для продакшена.
5. create-drop
Как create, но дополнительно удаляет таблицы при остановке приложения (когда закрывается SessionFactory). Особенно опасно в продакшене — случайный рестарт уничтожит все данные.
// В application.properties
spring.jpa.hibernate.ddl-auto=create-drop
// В тестах часто используется с @Transactional
@SpringBootTest
class UserRepositoryTest {
// таблицы создадутся перед тестом и удалятся после
}
Рекомендации по использованию
- Разработка:
update— удобно, но следите за изменениями через логи Hibernate - Тесты:
create-drop— идеально для интеграционных тестов - Продакшен:
validateилиnoneс использованием Flyway/Liquibase
В Spring Boot параметр называется spring.jpa.hibernate.ddl-auto, в чистом Hibernate — hibernate.hbm2ddl.auto. Значения идентичны.
Альтернативный взгляд: когда Hibernate не справляется
Коллега выше всё верно описал, но хочу добавить важный нюанс. Режим update часто подводит в сложных сценариях:
- Он не умеет переименовывать колонки — только добавлять новые
- Не может изменить тип данных, если в таблице уже есть данные
- Не удаляет колонки, которые вы убрали из сущности
Поэтому на реальных проектах лучше использовать миграции (Flyway или Liquibase). Пример настройки с Flyway:
// application.properties
spring.jpa.hibernate.ddl-auto=validate // только проверка
spring.flyway.enabled=true
spring.flyway.locations=classpath:db/migration
Тогда все изменения схемы вы контролируете через SQL-скрипты:
-- V1__create_user_table.sql
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
email VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
-- V2__add_full_name_column.sql
ALTER TABLE users ADD COLUMN full_name VARCHAR(255);
Это даёт полный контроль, версионирование и возможность отката. hbm2ddl.auto оставьте только для быстрых прототипов или тестов.
Ответов пока нет.
Войдите чтобы оставить ответ