2011-06-21 254 views
0
public enum Sources { 


     SOURCE_MANUAL("manual"), 

     SOURCE_RE_EDITING("re editing"); 


     private String source; 

     private Sources(String source){ 
      this.source = source; 
     } 

    public String getSource() { 
    return source; 
    } 
    } 


    Mapping in Domain object as 
     @Column(name = "SOURCE") 
     @Enumerated(EnumType.STRING) 
     public Sources getSource() { 
      return this.source; 
     } 

問題:在DB源列具有值(手動,重新編輯),所以當過我嘗試加載對象我得到以下異常枚舉映射在Hibernate中

Caused by: java.lang.IllegalArgumentException: No enum const class api.domain.Sources.manual 
[java]  at java.lang.Enum.valueOf(Enum.java:214) 
[java]  at org.hibernate.type.EnumType.nullSafeGet(EnumType.java:124) 

是我在這裏做錯了什麼?

+0

您使用的是什麼版本的hibernate?我正在使用版本3.5.6-最終,我不能重複你的問題。 – telm

+0

我使用3.5.3版本 – dpsdce

回答

1

枚舉中的source屬性與枚舉映射無關。就Hibernate而言,您的數據庫必須包含值SOURCE_MANUALSOURCE_RE_EDITING。由於其中一個值包含空格,因此可能無法在不遷移數據庫的情況下使用常規枚舉映射。可能有一些黑客,但似乎你最好只使用一個字符串的映射和轉換爲手動枚舉。

+0

正確,但沒有那麼有用。如果Dhirendra想要將某些任意字符串映射到枚舉,最好爲此創建一個專門的UserType。 –

0

嘗試升級到休眠版本3.5.6。

如果這不起作用,您也可以嘗試覆蓋枚舉中的toString()方法並返回枚舉名稱,但這不是很好,但它應該能夠在短期內解決您的問題。

public enum Sources { 


    SOURCE_MANUAL("SOURCE_MANUAL", "manual"), 

    SOURCE_RE_EDITING("SOURCE_RE_EDITING", "re editing"); 


    private String source; 
    private String enumName; 

    private Sources(String enumName, String source){ 
     this.source = source; 
     this.enumName = enumName; 
    } 

public String getSource() { 
return source; 
} 

public String toString() { 
return enumName; 
} 

} 
+0

這不工作,我想它不會因爲hibernate內部hibernate正在做Enum.valueOf(EnumType.class,「value」),這將失敗,因爲沒有這個「手動」字符串值的枚舉存在。 – dpsdce