Сделайте вызов hibernate другим методом, чем valueof () при сохранении перечислений - PullRequest
0 голосов
/ 18 ноября 2018

Я пытаюсь получить перечисление из базы данных, и Hibernate не находит значение свойства и поэтому выдает следующее исключение java.lang.IllegalArgumentException: нет константы перечисления com.intrawa.qx.validator.models.entity.Group.CONFIGTAB.false

Проблема возникает, когда hibernate вызывает метод valueum перечисления: at java.lang.Enum.valueOf (Enum.java:238)

Я работаю с базой данных, где не могу изменить имена столбцов.

Например, посмотрите на код:

@Entity
@Data
@Table(name = "bm_host_groups")
public class Group {

    @Enumerated(EnumType.STRING)
    private CONFIGTAB configTab;

    @AllArgsConstructor
    private enum CONFIGTAB {
        TRUE("true"),
        FALSE("false");


        @Getter @Setter
        private String value;
    }
}

В базе данных есть столбец с именем configTab с типом значения enum идва возможных значения («истина», «ложь»), когда в режиме гибернации вызывается значение значения («истина»), оно не находит ИСТИНА и выдает исключение.

Одно решение, которое я нашел, находится на этом посте: В чем причина java.lang.IllegalArgumentException: нет константного класса enum, хотя перебор значений () работает нормально?

Однако для этого требуется специальный метод, который принимает, например, «true»какзатем из базы данных капитализировать его, чтобы найти значение enum.

Я искал способ переопределить значение enum для valueof (), но в этом посте говорится, что это невозможно, и в основном предлагаем то же самое, что и первое решение,сделать собственный метод и сделать так, чтобы клиент вызывал его.Post: Переопределение valueof () и toString () в перечислении Java

Есть ли способ заставить hibernate вызывать пользовательский метод вместо valueof ()?

1 Ответ

0 голосов
/ 18 ноября 2018

Невозможно переопределить valueOf().Но можно манипулировать значением, которое получит valueOf().А именно, правильное решение - использовать AttributConverter и отбросить аннотацию @Enumerated, например:

@Getter @Setter
//@Enumerated(EnumType.STRING)
@Convert(converter=ConfigTabConverter.class)
private CONFIGTAB configTab;

. Конвертер довольно прост:

@Converter(autoApply=true)
public class ConfigTabConverter
        implements AttributeConverter<CONFIGTAB,, String> {

    @Override
    public String convertToDatabaseColumn(CONFIGTAB attribute) {
        return attribute.getValue();
    }

    @Override
    public CONFIGTAB convertToEntityAttribute(String dbData) {
        return CONFIGTAB.valueOf(dbData.toUpperCase());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...