Аннотации @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.
Пример использования:
@Convert
Аннотация @Convert применяется к атрибуту сущности для указания конкретного конвертера. Она принимает следующие параметры:
converter (обязательный):
Класс конвертера, который должен быть применен к атрибуту.
Пример: converter = StatusConverter.class.
attributeName (необязательный):
Используется для указания атрибута вложенного объекта (например, в @Embeddable).
По умолчанию: не используется.
Пример использования:
Значения по умолчанию
Если параметр autoApply не указан в @Converter, по умолчанию используется false.
Если параметр attributeName не указан в @Convert, конвертер применяется к текущему атрибуту.
Жизненный цикл
Применение: Конвертеры применяются на этапе маппинга сущности JPA. Они используются при сохранении сущности в базу данных и при загрузке сущности из базы данных.
Инициализация: Конвертеры инициализируются при создании EntityManagerFactory.
Уничтожение: Конвертеры остаются активными до тех пор, пока существует EntityManagerFactory.
Автоматическое применение конвертеров:
Если конвертер аннотирован @Converter(autoApply = true), он автоматически применяется ко всем атрибутам соответствующего типа в сущностях.
#Java #Training #Hard #Spring #SpringDataJPA #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.
Пример ручной регистрации конвертера:
Варианты настройки
Автоматическое применение:
Используйте @Converter(autoApply = true), если конвертер должен применяться ко всем атрибутам соответствующего типа.
Ручное применение:
Используйте @Convert(converter = MyConverter.class), если конвертер должен применяться только к конкретным атрибутам.
Кастомизация маппинга:
Для сложных сценариев можно использовать @Embeddable и @Embedded в сочетании с конвертерами.
Пример использования @Embeddable:
Использование вложенных объектов:
Конвертеры могут применяться к атрибутам вложенных объектов через параметр attributeName в @Convert.
#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