2013-05-08 3 views
0

Я уже потратил несколько часов на то, чтобы заставить это работать, но Hibernate все еще держит меня в недоумении, что там происходит внутри.
Вот что я хочу сделать:
Просто сохраняются List из enum сек через @Enumerated, который выглядит следующим образом:ClassCastException при сохранении enum через Hibernate

@LazyCollection(LazyCollectionOption.FALSE) 
@ElementCollection(targetClass=Role.class) 
@JoinTable(name = "userroles", joinColumns = @JoinColumn(name = "userId")) 
@Enumerated(EnumType.ORDINAL) 
private List<Role> roles; 

Мой enum класс:

public enum Role implements Serializable { 
    employee("Mitarbeiter"), 
    manager("Geschäftsleitung"), 
    stationleader("Stationsleitung"), 
    administration("Verwaltung"), 
    accountant("Buchhaltung"); 
@Transient 
private String description; 

private Role() 
{ 

} 

public void setDescription(String description) { 
    this.description = description; 
} 

private Role(String desc) { 
    this.description = desc; 
} 

@Override 
public String toString() { 
    return description; 
} 

public String getDescription() { 
    return description; 
} 
} 

Ошибка Я сталкиваюсь происходит на простой persist() класса, который держит List. И это основная причина:

Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Enum 
at org.hibernate.type.EnumType.nullSafeSet(EnumType.java:118) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 
at org.hibernate.type.CustomType.nullSafeSet(CustomType.java:155) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 
at org.hibernate.persister.collection.AbstractCollectionPersister.writeElement(AbstractCollectionPersister.java:811) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 
at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1201) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 
at org.hibernate.action.internal.CollectionRecreateAction.execute(CollectionRecreateAction.java:58) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 
at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:272) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:264) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:190) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:326) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1081) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:315) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 
at org.hibernate.engine.transaction.synchronization.internal.SynchronizationCallbackCoordinatorImpl.beforeCompletion(SynchronizationCallbackCoordinatorImpl.java:104) [hibernate-core-4.0.1.Final.jar:4.0.1.Final] 

Как я могу решить эту проблему? Кажется, что не было никаких известных ошибок этого, и я просто нашел ответы, не ответившие на несколько форумов. Я также попытался EnumType.STRING и оставить некоторые из аннотаций, без эффекта, хотя:/
EDIT: Я также попытался использовать только сырой enum со стандартным конструктором и без каких-либо полей, ничего, кроме значений. Поэтому ошибка не должна лежать в моем enum-pojo.
EDIT2:
Моя проблема немного солгала в другом месте. (JSF and type safety). Однако я принимаю ответ, как толкнул меня в правильном направлении :)

+0

Попробуйте преобразовать имена переименований в верхний регистр. Если это не помогает, установите уровень регистрации на TRACE и опубликуйте журнал здесь. –

+0

@MarlonBernardes Преобразование в верхний регистр ничего не меняет. Также не работает настройка 'Logger log = Logger.getLogger (« org.hibernate.SQL »); log.setLevel (Level.TRACE); 'поскольку я не вижу больше записей в журнале, чем раньше. (1 Информация) – Zhedar

+0

Используйте «org.hibernate.type» вместо «org.hibernate.SQL». Не устанавливайте его вручную, он должен быть настроен до запуска приложения (например: log4j.properties -> log4j.logger.org.hibernate.type = TRACE) –

ответ

1

Как ваш Enum имеет пользовательские атрибуты у вас есть несколько вариантов:

  1. Создайте свой собственный тип (UserType) следующим образом: https://community.jboss.org/wiki/UserTypeforpersistingaTypesafeEnumerationwithaVARCHARcolumn
  2. Создайте свойство Enum как transiente и используйте String getter и setter для заполнения.
+0

Я уже пробовал это. Я хотел объяснить это в разделе ниже. Но теперь я вижу, что там тоже написал ORDINAL:/ На самом деле 'String' был первым, что я пробовал. – Zhedar

+0

Какое исключение вы получили, когда использовали String? –

+0

Это все равно. – Zhedar

Смежные вопросы