Ошибка Hibernate / JPA - не распознаются некоторые строки в перечислении - PullRequest
5 голосов
/ 22 июня 2011

У меня есть перечисление в классе, составленное Hibernate. Одним из сопоставленных полей является тип enum, который имеет одно из следующих значений OK , NOK или NAP . NOK или NAP работает должным образом, но когда для поля установлен класс 'OK', Hibernate не может отобразить и получить значение, для которого установлено значение null:

java.lang.IllegalArgumentException: Unknown name value for enum class     com.a.b.c.d.Class$Status: OK
    at org.hibernate.type.EnumType.nullSafeGet(EnumType.java:113)

В классе:

private Status status;

@JoinColumn(name = "STATUS")
@Enumerated(EnumType.STRING)
public Status getStatus() {
    return status;
}

public enum Status {
    OK, NOK, NAP;
}

Если я изменю OK на OK2 , он будет работать правильно. _OK также работает. Насколько я понимаю, «ОК» не является зарезервированным именем (как в этом случае, когда парень использует new ), поскольку оно компилируется правильно.

Спасибо!

UPDATE:

Up 'до сих пор, что я делал, чтобы решить проблему, изменив enum и сохранив' _OK 'в базе данных вместо' OK ', как показано выше. Не очень хорошее решение, но оно работает по крайней мере.

public enum Status {
    _OK("OK"), 
    NOK("NOK"), 
    NAP("NAP");

    private String desc;

    private Status(String desc){
        this.desc = desc;
    }

    public String getDesc(){
        return desc;
    }
}

Сообщение об ошибке:

A Отчет об ошибке заполнен .

Ответы [ 3 ]

10 голосов
/ 22 июня 2011

Проблема в том, что в вашей базе данных есть значения, отличные от OK, NOK, NAP, и когда вы извлекаете записи, это когда вы получаете исключение, а не когда сохраняете.

Из вашего исключения com.a.b.c.d.Class$Status: OK2 похоже, что ваша база данных имеет это значение и, следовательно, исключение java.lang.IllegalArgumentException: Unknown name value for enum class.

Проверьте вашу таблицу на недопустимые значения, удалите / исправьте их и попробуйте снова.

3 голосов
/ 28 ноября 2011

В качестве другого обходного пути вы можете попытаться предоставить точное определение столбца, чтобы иметь столбец VARCHAR:

@Column(columnDefinition = "VARCHAR(3)")
// @Column(columnDefinition = "VARCHAR2(3)") // VARCHAR2 for Oracle
@Enumerated(EnumType.STRING)
public Status getStatus() {
    return status;
}

public enum Status {
    OK, NOK, NAP;
}
2 голосов
/ 24 ноября 2011

У меня точно такая же проблема после обновления HSQLDB с 1.8 до 2.2.6. Для перечислений Hibernate создает столбцы типа CHARACTER, которые являются столбцами фиксированной длины (в отличие от VARCHAR). Длина этого, вероятно, определяется как длина самого длинного значения перечисления. Операторы INSERT / UPDATE генерируются правильно Hibernate, но при чтении значений из таблицы эти более короткие значения получаются с добавлением пробелов.

Итак, похоже, что драйвер HSQLDB их не обрезает. И если это так, я думаю, что ошибка должна быть подана для HSQLDB, а не для Hibernate. Однако, если это поведение HSQLDB совместимо со стандартом SQL, тогда EnumType Hibernate должен выполнять усечение при чтении значений перечисления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...