2013-05-08 184 views
0

我現在浪費了幾個小時試圖讓它工作,但休眠仍然讓我想知道里面發生了什麼。
這是我想做的事: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它看起來像這樣簡單地保持enumList 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)。不過我會接受的答案如何在正確的方向:)

+0

嘗試將您的枚舉名稱轉換爲大寫。如果這沒有幫助,請將記錄器級別設置爲TRACE並在此處發佈日誌。 – 2013-05-08 02:20:13

+0

@MarlonBernardes轉換爲大寫並沒有改變一件事。它似乎也沒有工作設置Logger log = Logger.getLogger(「org.hibernate.SQL」); log.setLevel(Level.TRACE);'因爲我沒有看到比以前更多的日誌信息。 (1 Info) – Zhedar 2013-05-08 02:45:34

+0

使用「org.hibernate.type」而不是「org.hibernate.SQL」。不要手動設置它,它必須在應用程序啓動之前配置(例如:log4j.properties - > log4j.logger.org.hibernate.type = TRACE) – 2013-05-08 02:52:44

回答

1

當你的枚舉推我有自定義屬性,你有一些選擇:

  1. 創建自定義的類型(用戶類型)如下: https://community.jboss.org/wiki/UserTypeforpersistingaTypesafeEnumerationwithaVARCHARcolumn
  2. 創建您的Enum屬性作爲transiente並使用String getter 和setter來填充。
+0

我已經試過了。我想在下面的部分解釋。但現在我看到我在那裏寫了ORDINAL:/ 其實'String'是我嘗試的第一件事。 – Zhedar 2013-05-08 02:48:17

+0

你使用String時有什麼異常? – 2013-05-08 02:49:09

+0

這一切都是一樣的。 – Zhedar 2013-05-08 02:49:32