package dev.mvvasilev.common.data; import jakarta.persistence.AttributeConverter; import jakarta.persistence.Converter; @Converter public abstract class AbstractEnumConverter & PersistableEnum, E> implements AttributeConverter { private final Class clazz; public AbstractEnumConverter(Class clazz) { this.clazz = clazz; } @Override public E convertToDatabaseColumn(T attribute) { return attribute != null ? attribute.value() : null; } @Override public T convertToEntityAttribute(E dbData) { if (dbData == null) { return null; } T[] enums = clazz.getEnumConstants(); for (T e : enums) { if (e.value().equals(dbData)) { return e; } } throw new UnsupportedOperationException(String.format("Can't find value '%s' for enum '%s'", dbData, clazz.getCanonicalName())); } }