JPA с Enum в БД влияние на перформанс

К сожалению есть только два EnumType STRING и ORDINAL. При использовании ORDINAL есть опасность что в большом проекте его поменяют или удалят значение и соответственно все сломается. Хотелось бы иметь третий тип типа NUMBER в котором мы бы создавали Enums и передавали бы номер который должен был бы испльзовался для значения записи в БД. К примеру

public enum AnyType {
    TREE(0), // ну или TREE(0, значения которые нужны для конструктора
    CAR(1);
   private final int number;
   private final int age;
   
   AnyType(int number, int age) {
       this.number = number;
       this.age = age;
    }

и чтобы JPA использовал getNumber как значение которое бы использовалось как ORDINAL но уже меньше шансов на то что может что то сломаться при изменении Enum. Как можно такое реализовать или как можно используя @Enumerated(EnumType.STRING) улучшить производительность при выборке и записи данных?


Ответы (2 шт):

Автор решения: Barmaley

Примерно так?

public enum AnyType {
    TREE(0), // ну или TREE(0, значения которые нужны для конструктора
    CAR(1);
   private final int number;
   private int age=0;
   
    AnyType(int number) {
       this.number = number;
       this.age = number;
    }
    
    public int getNumber() {
        return this.number;
    }
    
    public int getAge() {
        return this.age;
    }
}

Тогда AnyType.TREE.getAge() - будет гарантированно совпадать с вашим ordinal и в то же время не будет выдавать TREE в БД.

→ Ссылка
Автор решения: Roman Konoval

Создайте свою реализацию javax.persistence.AttributeConverter для типа AnyType.

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

→ Ссылка