Гибернация — сопоставление столбца с типом перечисления (значения не ординалы)

#java #hibernate #enumeration #lookup-tables

#java #спящий режим #перечисление #поисковые таблицы

Вопрос:

Я нашел здесь несколько похожих вопросов, но не совсем то же самое.

Если значения моего перечисления не являются ординалами, как я могу сопоставить поле класса с этим типом перечисления?

— Уровень базы данных — значения таблицы поиска

 insert into ShowInfoLookup(ID, Name) values (0 | 64, 'Hide (auto set by the system)');

insert into ShowInfoLookup(ID, Name) values (1 | 64, 'Show (auto set by the system)');

insert into ShowInfoLookup(ID, Name) values (0 | 128, 'Hide (manually set)');

insert into ShowInfoLookup(ID, Name) values (1 | 128, 'Show (manually set)');
  

— Java-код перечисления

 package com.test.constants;

public enum ShowInfoLookup {

    Invalid(0),
    HideAutoSet(Value.HIDE | Value.AUTO_SET), // 64
    ShowAutoSet(Value.SHOW | Value.AUTO_SET), // 65
    HideManuallySet(Value.HIDE | Value.MANUALLY_SET), // 128
    ShowManuallySet(Value.SHOW | Value.MANUALLY_SET); // 129

    private static class Value {
        private static final int HIDE = 0; // false - hide
        private static final int SHOW = 1; // true - show
        private static final int AUTO_SET = 64;
        private static final int MANUALLY_SET = 128;
    }

    private int value = 0;

    private ShowInfoLookup(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }

    public String toString() {
        return String.valueOf(value);
    }

    public static ShowInfoLookup getInstance(int value) {
        for (ShowInfoLookup type : ShowInfoLookup.values()) {
            if (value == type.value) {
                return type;
            }
        }

        return Invalid;
    }

}
  

— Класс сущности Hibernate, который у меня есть, я знаю EnumType.ПОРЯДКОВЫЙ номер здесь не будет работать

 public class Item {

    @Column(name ="ShowAnalystInfo", nullable = false)
    @Enumerated(EnumType.ORDINAL)
    private ShowInfoLookup showInfo;

}
  

Комментарии:

1. Вы могли бы создать режим гибернации UserType . Аналогичный пример для пользовательского сопоставления перечислений здесь .

2. @RobbyCornelissen Спасибо, но для меня это звучит излишне. Нет ли какого-нибудь более простого способа? Я имею в виду, что-то вроде общего RatingUserType :), который будет работать для всех видов перечислений, а не только для перечисления рейтинга.

3. Конечно, вы могли бы пометить enum в сущности как @Transient , добавить еще одно целочисленное поле для представления значения enum , чтобы оно сохранялось, и синхронизировать оба поля в методах получения / установки или с использованием методов жизненного цикла сущности.

4. @RobbyCornelissen Хорошо, спасибо, я подумаю об этом. Я также только что нашел это: gabiaxel.com/2011/01/better-enum-mapping-with-hibernate.html . Звучит прямо в точку, но также требует дополнительной работы.

5. Общая RatingUserType идея также должна быть более или менее выполнима. При условии, что все ваши enum системы расширяют общий интерфейс.