Индекс массива JPA вне допустимого диапазона

Я использую JPA в своем WAS 6.1. Я пытаюсь выполнить эту строку:

@Entity
@Table(name="some_Table")
@NamedQueries({
@NamedQuery(name="getAllAccountTypeService",
query="SELECT a FROM AccountTypeServiceAssoc a " +
"WHERE a.delete.deletedDate IS NULL ")

.....

Query query = em.createNamedQuery("getAllAccountTypeService");  
return query.getResultList();

Я получаю это в моем SystemOut.log: org.apache.openjpa.persistence.PersistenceException: Array index out of range: 48

Где находится массив в приведенном выше коде, который выходит за пределы допустимого диапазона? Ошибка возникает в этой строке № 100:

EnumValueHandler.java (это класс jpa)

 public Object toObjectValue(ValueMapping vm, Object val) {
   97           if (val == null)
   98               return null;
   99           if (_ordinal)
  100               return _vals[((Number) val).intValue()];
  101           return Enum.valueOf(vm.getType(), (String) val);
  102       }

Я не могу понять, что такое _vals и что такое val Спасибо за помощь.

РЕДАКТИРОВАТЬ: Спасибо за ответ. Столбец действительно сопоставляется с порядковым номером следующим образом:

@Column(name="SVC_ID") @Enumerated(EnumType.ORDINAL) защищенная служба ServiceType;

Но где мы устанавливаем диапазон порядкового номера? Это делает 48 за пределами диапазона.


person Victor    schedule 20.01.2012    source источник


Ответы (1)


Одним из полей загружаемых объектов является enum, отображаемый как порядковый номер.

Это означает, что порядковый номер перечисления хранится в базе данных и используется при загрузке объекта для поиска соответствующего экземпляра enm.

И вместо одного из допустимых порядковых номеров (от 0 до 4, если для этого перечисления имеется 5 значений) ячейка в базе данных содержит значение 48 (что потребовало бы перечисления как минимум с 49 экземплярами).

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

person JB Nizet    schedule 20.01.2012
comment
Большое спасибо. Не могли бы вы увидеть мой РЕДАКТИРОВАТЬ? - person Victor; 21.01.2012
comment
Порядковый номер автоматически генерируется компилятором для любого перечисления, и изменить его значение невозможно. Первый объявленный экземпляр перечисления имеет 0, второй — 1 и т. д. - person JB Nizet; 21.01.2012
comment
Спасибо. Так почему же 48 вне диапазона? - person Victor; 21.01.2012
comment
Потому что в вашем перечислении, вероятно, меньше 49 экземпляров. Например, если вы сопоставляете столбец с перечислением Season {ВЕСНА, ЛЕТО, ОСЕНЬ, ЗИМА}, единственными допустимыми порядковыми номерами являются 0 (для ВЕСНЫ), 1 (для ЛЕТА), 2 (для ОСЕНИ) и 3 (для ЗИМЫ). . 48 выходит за пределы диапазона [0–3] для этого перечисления. - person JB Nizet; 21.01.2012
comment
Большое спасибо. Я понял это сейчас. - person Victor; 21.01.2012