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

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

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

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

@Converter: Позволяет определить класс, который реализует интерфейс AttributeConverter для преобразования атрибута сущности в тип, поддерживаемый базой данных, и наоборот.
@Convert: Позволяет применить конкретный конвертер к атрибуту сущности.

Эти аннотации полезны, когда требуется сохранить в базе данных сложные типы данных (например, перечисления, коллекции или пользовательские объекты), которые не поддерживаются напрямую JPA.

Параметры и настройки

@Converter

Аннотация @Converter применяется к классу, который реализует интерфейс AttributeConverter. Она принимает следующие параметры:
autoApply (необязательный):
Если true, конвертер автоматически применяется ко всем атрибутам сущности, которые имеют соответствующий тип.
Если false, конвертер применяется только к тем атрибутам, которые явно аннотированы
@Convert.
По умолчанию: false.

Пример использования:
@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());
}
}


@Convert

Аннотация @Convert применяется к атрибуту сущности для указания конкретного конвертера. Она принимает следующие параметры:

converter (обязательный):
Класс конвертера, который должен быть применен к атрибуту.
Пример: converter = StatusConverter.class.


attributeName (необязательный):
Используется для указания атрибута вложенного объекта (например, в @Embeddable).
По умолчанию: не используется.


Пример использования:
@Entity
public class User {
@Convert(converter = StatusConverter.class)
private Status status;
}


Значения по умолчанию

Если параметр autoApply не указан в @Converter, по умолчанию используется false.
Если параметр attributeName не указан в
@Convert, конвертер применяется к текущему атрибуту.

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

Применение: Конвертеры применяются на этапе маппинга сущности JPA. Они используются при сохранении сущности в базу данных и при загрузке сущности из базы данных.
Инициализация: Конвертеры инициализируются при создании EntityManagerFactory.
Уничтожение: Конвертеры остаются активными до тех пор, пока существует EntityManagerFactory.


Автоматическое применение конвертеров:

Если конвертер аннотирован @Converter(autoApply = true), он автоматически применяется ко всем атрибутам соответствующего типа в сущностях.

#Java #Training #Hard #Spring #SpringDataJPA #Convert #Converter
Кастомизация конвертеров:

Spring Boot позволяет регистрировать конвертеры вручную через конфигурацию EntityManagerFactory.

Пример ручной регистрации конвертера:
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource);
em.setPackagesToScan("com.example.domain");

HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);

Map<String, Object> properties = new HashMap<>();
properties.put("hibernate.dialect", "org.hibernate.dialect.MySQL8Dialect");
properties.put("hibernate.hbm2ddl.auto", "update");
em.setJpaPropertyMap(properties);

// Регистрация конвертера
em.setSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE);
em.getJpaPropertyMap().put("javax.persistence.bean.validation.mode", "none");
em.getJpaPropertyMap().put("hibernate.session_factory.interceptor", new EmptyInterceptor() {
@Override
public void onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
// Логика перехвата
}
});

return em;
}


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

Автоматическое применение:

Используйте @Converter(autoApply = true), если конвертер должен применяться ко всем атрибутам соответствующего типа.

Ручное применение:
Используйте @Convert(converter = MyConverter.class), если конвертер должен применяться только к конкретным атрибутам.

Кастомизация маппинга:
Для сложных сценариев можно использовать @Embeddable и @Embedded в сочетании с конвертерами.

Пример использования @Embeddable:
@Embeddable
public class Address {
private String street;
private String city;

@Convert(converter = ZipCodeConverter.class)
private String zipCode;
}


Использование вложенных объектов:
Конвертеры могут применяться к атрибутам вложенных объектов через параметр attributeName в @Convert.

#Java #Training #Hard #Spring #SpringDataJPA #Convert #Converter