@Index в Hibernate
Аннотация @Index в Hibernate используется для определения индекса на одном или нескольких столбцах таблицы базы данных. Индексы ускоряют поиск и сортировку данных, но могут замедлять операции вставки и обновления.
Пакет: org.hibernate.annotations
Применяется к: классу (на уровне @Table), полю или свойству.
Параметры и настройки
Аннотация @Index имеет следующие атрибуты:
name (String):
Название индекса в БД.
Если не указано, Hibernate сгенерирует имя автоматически (например, IDX_<TABLE>_<COLUMN>).
columnList (String):
Обязательный параметр.
Список столбцов, входящих в индекс, через запятую (например, "username, email").
Поддерживает порядок сортировки: "username ASC, email DESC".
unique (boolean, по умолчанию false):
Если true, создает уникальный индекс (аналог UNIQUE INDEX в SQL).
options (String):
Дополнительные SQL-опции для индекса (например, "USING HASH" для MySQL).
Жизненный цикл и обработка
Во время компиляции:
Hibernate анализирует аннотацию и включает её в метаданные ORM.
При старте приложения (Hibernate bootstrap):
Индекс добавляется в DDL-скрипт при автоматической генерации схемы (hibernate.hbm2ddl.auto=create/update).
Если БД уже существует, Hibernate не изменяет индексы при update (только создает новые).
Во время выполнения:
Индекс используется СУБД для оптимизации запросов, но Hibernate напрямую его не контролирует.
Механизмы Hibernate и Spring Boot, влияющие на @Index
Генерация DDL (hibernate.hbm2ddl.auto):
create – создает таблицы и индексы при старте.
update – добавляет новые индексы, но не удаляет старые.
validate – проверяет соответствие модели и БД (включая индексы).
none – отключает управление схемой.
Настройки Spring Boot (application.properties):
Альтернативные способы определения индексов:
Через @Table(indexes = @Index(...)):
Через schema.sql (ручное управление индексами).
Кастомизация имен индексов:
Глобальное именование через ImplicitNamingStrategy (редко используется для индексов).
Особенности и ограничения
СУБД-специфичные индексы (например, частичные индексы в PostgreSQL) требуют @Index(options = "WHERE condition") или ручного SQL.
Составные индексы (columnList = "col1, col2") работают только в указанном порядке.
Миграции: Для сложных изменений индексов лучше использовать Flyway/Liquibase.
#Java #Training #Hard #Spring #Hibernate #Index
Аннотация @Index в Hibernate используется для определения индекса на одном или нескольких столбцах таблицы базы данных. Индексы ускоряют поиск и сортировку данных, но могут замедлять операции вставки и обновления.
Пакет: org.hibernate.annotations
Применяется к: классу (на уровне @Table), полю или свойству.
Параметры и настройки
Аннотация @Index имеет следующие атрибуты:
name (String):
Название индекса в БД.
Если не указано, Hibernate сгенерирует имя автоматически (например, IDX_<TABLE>_<COLUMN>).
columnList (String):
Обязательный параметр.
Список столбцов, входящих в индекс, через запятую (например, "username, email").
Поддерживает порядок сортировки: "username ASC, email DESC".
unique (boolean, по умолчанию false):
Если true, создает уникальный индекс (аналог UNIQUE INDEX в SQL).
options (String):
Дополнительные SQL-опции для индекса (например, "USING HASH" для MySQL).
Жизненный цикл и обработка
Во время компиляции:
Hibernate анализирует аннотацию и включает её в метаданные ORM.
При старте приложения (Hibernate bootstrap):
Индекс добавляется в DDL-скрипт при автоматической генерации схемы (hibernate.hbm2ddl.auto=create/update).
Если БД уже существует, Hibernate не изменяет индексы при update (только создает новые).
Во время выполнения:
Индекс используется СУБД для оптимизации запросов, но Hibernate напрямую его не контролирует.
Механизмы Hibernate и Spring Boot, влияющие на @Index
Генерация DDL (hibernate.hbm2ddl.auto):
create – создает таблицы и индексы при старте.
update – добавляет новые индексы, но не удаляет старые.
validate – проверяет соответствие модели и БД (включая индексы).
none – отключает управление схемой.
Настройки Spring Boot (application.properties):
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.default_schema=public
spring.jpa.show-sql=true
Альтернативные способы определения индексов:
Через @Table(indexes = @Index(...)):
@Entity
@Table(indexes = @Index(name = "idx_user_email", columnList = "email", unique = true))
public class User { ... }
Через schema.sql (ручное управление индексами).
Кастомизация имен индексов:
Глобальное именование через ImplicitNamingStrategy (редко используется для индексов).
Особенности и ограничения
СУБД-специфичные индексы (например, частичные индексы в PostgreSQL) требуют @Index(options = "WHERE condition") или ручного SQL.
Составные индексы (columnList = "col1, col2") работают только в указанном порядке.
Миграции: Для сложных изменений индексов лучше использовать Flyway/Liquibase.
#Java #Training #Hard #Spring #Hibernate #Index