これを機能させるために数時間を無駄にしましたが、Hibernate は内部で何が起こっているのか疑問に思っています。
私がやりたいことは次のとおりです。
単純に、次のように s 経由で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
また、標準コンストラクターを使用してフィールドを使用せず、値
のみを使用しようとしました。したがって、エラーは私の enum-pojo にあってはなりません。
EDIT2:
私の問題は少し別の場所にありました。( JSF と型安全性)。しかし、私はどのように私を正しい方向に押し上げたかという答えを受け入れます:)