java - 通过 Hibernate 持久化枚举时出现 ClassCastException

标签 java hibernate enums persistence classcastexception

我现在已经浪费了几个小时试图让它工作,但 Hibernate 仍然让我想知道里面发生了什么。
这就是我想做的:
只需通过 @Enumerated 保留 enumList 即可,如下所示:

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

我的枚举类:

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;
}   
}

我遇到的错误发生在持有List的类的一个简单的persist()处。其根本原因是:

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 并保留了一些注释,但没有效果:/
编辑: 我还尝试只使用带有标准构造函数的原始枚举,没有字段,只有值。所以错误一定不在我的 enum-pojo 中。
编辑2:
我的问题出在其他地方。 (JSF and type safety)。不过,我会接受如何将我推向正确方向的答案:)

最佳答案

由于您的枚举具有自定义属性,因此您有一些选择:

  1. 按如下方式创建自定义类型 (UserType): https://community.jboss.org/wiki/UserTypeforpersistingaTypesafeEnumerationwithaVARCHARcolumn
  2. 将 Enum 属性创建为 transient 属性并使用 String getter 和 setter 来填充。

关于java - 通过 Hibernate 持久化枚举时出现 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16431610/

相关文章:

java - 单表继承及关系

typescript 枚举作为参数类型允许无效值

java - 枚举中来自供应商的无界通配符通用数组

java - 评估 switch 中的枚举

java - 检查一个数组是否与java中的另一个数组相反

java - 如果不使用validation.excludeMethods,则无法在同一操作类下调用两个不同的方法

java - Android 混淆 Proguard 问题

java - 通讯链路故障 : Connection reset with C3P0

java - 为什么 Java 7 为签名的应用程序请求网络权限?

postgresql - JPA:如何从其他表中删除用户和所有引用?