Java for Beginner
675 subscribers
557 photos
156 videos
12 files
851 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Аннотация @Enumerated

Аннотация @Enumerated используется в Java Persistence API (JPA) для указания способа маппинга (отображения) перечислений (enum) на базу данных. Она находится в пакете javax.persistence (или jakarta.persistence, если используется Jakarta EE). Эта аннотация применяется к полям или свойствам сущности, которые являются перечислениями, и определяет, как значение перечисления будет сохраняться в базе данных.

Аннотация @Enumerated принимает один параметр — value, который определяет тип маппинга перечисления.

Параметр value может принимать одно из двух значений:

EnumType.ORDINAL:
Перечисление сохраняется в базе данных как целое число (индекс значения перечисления).
Например, если у вас есть перечисление Status { ACTIVE, INACTIVE, PENDING }, то ACTIVE будет сохранено как 0, INACTIVE — как 1, PENDING — как 2.
Недостаток: если порядок значений в перечислении изменится, это может привести к ошибкам в данных.


EnumType.STRING:
Перечисление сохраняется в базе данных как строка (имя значения перечисления).
Например, ACTIVE будет сохранено как строка "ACTIVE".
Преимущество: такой подход более устойчив к изменениям в перечислении, так как не зависит от порядка значений.


Пример использования:
@Enumerated(EnumType.STRING)
private Status status;


Если аннотация @Enumerated не указана, JPA по умолчанию использует EnumType.ORDINAL.

Жизненный цикл

Применение: Аннотация @Enumerated применяется на этапе маппинга сущности JPA. Она используется при создании таблиц в базе данных (если используется автоматическая генерация схемы) и при выполнении операций чтения/записи данных.
Инициализация: При загрузке сущности из базы данных JPA использует указанный тип маппинга (ORDINAL или STRING) для преобразования данных в соответствующее значение перечисления.
Уничтожение: При сохранении сущности в базу данных JPA преобразует значение перечисления в указанный тип данных (число или строку).


Механизмы Spring и настройки Spring Boot

JPA и Hibernate: Spring Data JPA использует провайдеров JPA (например, Hibernate) для работы с базой данных. Аннотация @Enumerated обрабатывается на уровне JPA, а не Spring, но Spring обеспечивает интеграцию с JPA через EntityManager и репозитории.
Маппинг сущностей: Spring Data JPA автоматически маппит сущности на таблицы базы данных, используя аннотации JPA, включая @Enumerated.

#Java #Training #Hard #Spring #SpringDataJPA #Enumerated
Настройки Spring Boot

Spring Boot упрощает настройку JPA через свойства конфигурации. Вот несколько ключевых настроек, которые могут влиять на работу @Enumerated:
Если используется автоматическая генерация схемы (например, через Hibernate), Spring Boot настраивает это через свойство:
spring.jpa.hibernate.ddl-auto=update


В этом случае Hibernate создаст столбец для перечисления с типом данных, соответствующим EnumType (например, INT для ORDINAL или VARCHAR для STRING).

Настройки Hibernate:
Spring Boot позволяет настраивать Hibernate через свойства, например:
spring.jpa.properties.hibernate.format_sql=true

Эти настройки не влияют напрямую на @Enumerated, но могут помочь в отладке SQL-запросов, связанных с маппингом перечислений.

Кастомизация маппинга:
Если требуется кастомизировать маппинг перечислений (например, использовать собственные преобразователи), можно использовать аннотацию @Converter или реализовать интерфейс AttributeConverter.

Пример кастомизации через @Converter:
@Converter(autoApply = true)
public class StatusConverter implements AttributeConverter<Status, String> {
@Override
public String convertToDatabaseColumn(Status status) {
return status.name().toLowerCase();
}

@Override
public Status convertToEntityAttribute(String dbData) {
return Status.valueOf(dbData.toUpperCase());
}
}


Варианты настройки

Использование EnumType.ORDINAL:
Подходит для случаев, когда порядок значений перечисления фиксирован и не будет изменяться.
Экономит место в базе данных, так как хранится как число.


Использование EnumType.STRING:

Рекомендуется для случаев, когда порядок значений перечисления может измениться.
Удобно для чтения данных напрямую из базы данных, так как значения хранятся в виде строк.


Кастомизация через @Converter:
Позволяет гибко настраивать маппинг перечислений, например, сохранять значения в нижнем регистре или использовать собственные форматы.

#Java #Training #Hard #Spring #SpringDataJPA #Enumerated