--- aliases: tags: - зрелость/🌱 date: - - 2024-05-17 zero-link: - "[[00 Hibernate]]" parents: linked: --- Конвертеры в Hibernate позволяют изменить тип хранения в БД. Например, у нас в колонке будет храниться строка "POST, GET, PUT", а в Java мы хотим сразу получать `Set`, а не строку, для этого нужно написать конвертер. Создаем класс-конвертер, который будет преобразовывать строку в `Set` и обратно: ```java import javax.persistence.AttributeConverter; import javax.persistence.Converter; import java.util.Arrays; import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; @Converter public class StringSetConverter implements AttributeConverter, String> { @Override public String convertToDatabaseColumn(Set attribute) { if (attribute == null || attribute.isEmpty()) { return ""; } return attribute.stream().collect(Collectors.joining(", ")); } @Override public Set convertToEntityAttribute(String dbData) { if (dbData == null || dbData.isEmpty()) { return new HashSet<>(); } return Arrays.stream(dbData.split(", ")) .collect(Collectors.toSet()); } } ``` Используем этот конвертер в нашей сущности: ```java import io.quarkus.hibernate.orm.panache.PanacheEntity; import javax.persistence.Convert; import javax.persistence.Entity; import java.util.Set; @Entity public class MyEntity extends PanacheEntity { @Convert(converter = StringSetConverter.class) public Set methods; // остальные поля и методы } ``` Можно также использовать `@Converter(autoApply = true)`, чтобы данный конвертер автоматически применялся ко всем полям соответствующего типа в любых сущностях, где это возможно. Другими словами, если у вас есть несколько сущностей с полями типа `Set`, этот конвертер будет автоматически применяться ко всем этим полям без необходимости явно указывать его с помощью `@Convert`.