Я уже потратил несколько часов на то, чтобы заставить это работать, но 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). Однако я принимаю ответ, как толкнул меня в правильном направлении :)
Попробуйте преобразовать имена переименований в верхний регистр. Если это не помогает, установите уровень регистрации на TRACE и опубликуйте журнал здесь. –
@MarlonBernardes Преобразование в верхний регистр ничего не меняет. Также не работает настройка 'Logger log = Logger.getLogger (« org.hibernate.SQL »); log.setLevel (Level.TRACE); 'поскольку я не вижу больше записей в журнале, чем раньше. (1 Информация) – Zhedar
Используйте «org.hibernate.type» вместо «org.hibernate.SQL». Не устанавливайте его вручную, он должен быть настроен до запуска приложения (например: log4j.properties -> log4j.logger.org.hibernate.type = TRACE) –