通过Hibernate持久化枚举时的ClassCastException

时间:2013-05-08 02:16:20

标签: java hibernate enums persistence classcastexception

我现在浪费了几个小时试图让它工作,但Hibernate仍然让我想知道里面发生了什么。
这就是我想要做的事:
只需List enum @Enumerated通过@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

我怎么解决这个问题?似乎没有任何已知的错误,我只是在几个论坛中找到了未回答的线程。我也尝试了enum并留下了一些注释,但没有效果:/
修改 我还尝试使用带有标准构造函数的原始{{1}}而没有字段,只有值。因此错误不应该出现在我的enum-pojo中 的 EDIT2:
我的问题在其他地方撒了一点。 (JSF and type safety)。但是我会接受答案如何将我推向正确的方向:)

1 个答案:

答案 0 :(得分:1)

由于你的枚举有自定义属性,你有一些选择:

  1. 创建自定义类型(UserType),如下所示: https://community.jboss.org/wiki/UserTypeforpersistingaTypesafeEnumerationwithaVARCHARcolumn
  2. 将您的Enum属性创建为transiente并使用String getter 和setter填充。