Установка значений Ordinal Enum для начала с 1 вместо 0

У меня есть Enum с тремя значениями. Он используется как свойство в компоненте Entity.

Вот свойство в бине:

@Enumerated(EnumType.ORDINAL)
private BillingMethod billingMethod;

Вот класс перечисления:

public enum BillingMethod  {
    ONLINEBILL("enum.billingmethod.onlinebill"), // Should be 1, but is now 0 in the database
    PAPERBILL("enum.billingmethod.paperbill"), // Should be 2, but is now 1 in the database
    PRINT("enum.billingmethod.print"); // Should be 3, but is now 2 in the database

    private String tag;

    private BillingMethod(String tag){
        this.tag = tag;
    }

    @Override
    public String getTag() {
        return tag;
    }
}

Есть очень редкая конкретная причина, по которой мне нужны эти значения 1, 2, 3. Вместо обычных 0, 1, 2 в базе данных.

Не беспокойтесь о tag здесь, он используется для получения представления String из файла свойств.

Итак, как я могу установить ОРДИНАЛ, чтобы он начинался с 1 вместо 0?


person Steve Waters    schedule 30.12.2016    source источник
comment
См.: stackoverflow.com/ вопросы/1067352/   -  person Alex    schedule 30.12.2016
comment
@AlexR, у меня это не сработало. Все еще сохраняя 0 для первого значения, 1 для второго, в базе данных.   -  person Steve Waters    schedule 30.12.2016
comment
Я недостаточно хорошо прочитал вопрос. Я прошу прощения. Это обходной путь, который позволит вам использовать назначенный номер вместо порядкового значения. Очевидно, что это не работает для вашего варианта использования. Моя ошибка.   -  person Alex    schedule 31.12.2016
comment
Посмотрите здесь: gabiaxel.com/2011/01/better -enum-mapping-with-hibernate.html Я пробовал, работает...   -  person olivmir    schedule 16.01.2018


Ответы (2)


Я вижу два варианта:

  1. Самый простой: сопоставьте Integer для гибернации, выполните декодирование перечисления в геттере:

    @Column(...)
    private Integer billingMethod;
    
    public BillingMethod getBillingMethod() {
         // add here better error handling (logging additional info
         // to help diagnose array out of bound exceptions).
         return BillingMethod.values()[billingMethod - 1];
    }
    
    // add a setter doing a similar thing
    

    Проблема в том, что поиск с помощью hql или критериев не будет работать без того самого кодирования/декодирования. Не очень здорово.

  2. Создайте пользовательский тип пользователя. Дополнительные сведения см. в справочной документации.

    Затем сопоставьте поле следующим образом:

    @Type("com.fully.qualified.class.name.of.MyUserType")
    private BillingMethod billingMethod;
    

    (при использовании полного имени типа пользователя в аннотации @Type регистрировать его не нужно)

    Немного сложнее реализовать, но будет работать во всех ситуациях, где сработало бы стандартное отображение перечисления.

person Thierry    schedule 30.12.2016
comment
Вы также можете сначала ввести значение перечисления DUMMY - person jontro; 27.03.2018

У меня была такая же проблема - посмотрите здесь решение, которое сработало для меня:

Улучшенное сопоставление Enum с помощью Hibernate

Автор использует Hibernate-UserTypes для этой проблемы. Я реализовал это так же, и это работает!

person olivmir    schedule 16.01.2018