У вас проблема здесь, и это ограниченные возможности JPA, когда дело доходит до обработки перечислений. С перечислениями у вас есть два варианта:
- Храните их как число, равное
Enum.ordinal()
, что является ужасной идеей (imho); или
- Сохраните их как строку, равную
Enum.name()
. Примечание: не toString()
, как вы могли бы ожидать, тем более что поведение по умолчанию Enum.toString()
должно возвращать name()
.
Лично я думаю, что лучший вариант - (2).
Теперь у вас есть проблема в том, что вы определяете значения, которые не представляют недействительные имена экземпляров в Java (а именно, используют дефис). Итак, ваш выбор:
- Измените ваши данные;
- Сохранять строковые поля и неявно преобразовывать их в перечисления в ваших объектах или из них; или
- Используйте нестандартные расширения, такие как TypeConverters.
Я бы делал их в таком порядке (с начала до конца) в порядке предпочтения.
Кто-то предложил конвертер Oracle TopLink, но вы, вероятно, используете Toplink Essentials, являющийся эталонной реализацией JPA 1.0, которая является подмножеством коммерческого продукта Oracle Toplink.
В качестве другого предложения я настоятельно рекомендую переключиться на EclipseLink . Это гораздо более полная реализация, чем Toplink Essentials, и Eclipselink будет эталонной реализацией JPA 2.0 после ее выпуска (ожидается в середине следующего года JavaOne).