我現在浪費了幾個小時試圖讓它工作,但休眠仍然讓我想知道里面發生了什麼。
這是我想做的事:ClassCastException當通過休眠持久枚舉
@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;
}
}
我遇到錯誤時
通過@Enumerated
它看起來像這樣簡單地保持enum
的List
A S在持有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
標準的構造和沒有字段,不過值。所以這個錯誤不能存在於我的enum-pojo中。
EDIT2:
我的問題在其他地方說了一點。 (JSF and type safety)。不過我會接受的答案如何在正確的方向:)
嘗試將您的枚舉名稱轉換爲大寫。如果這沒有幫助,請將記錄器級別設置爲TRACE並在此處發佈日誌。 – 2013-05-08 02:20:13
@MarlonBernardes轉換爲大寫並沒有改變一件事。它似乎也沒有工作設置Logger log = Logger.getLogger(「org.hibernate.SQL」); log.setLevel(Level.TRACE);'因爲我沒有看到比以前更多的日誌信息。 (1 Info) – Zhedar 2013-05-08 02:45:34
使用「org.hibernate.type」而不是「org.hibernate.SQL」。不要手動設置它,它必須在應用程序啓動之前配置(例如:log4j.properties - > log4j.logger.org.hibernate.type = TRACE) – 2013-05-08 02:52:44