2011-06-21 20 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内のソース列が(編集再、マニュアル)の値を持っているので、列挙型のマッピング

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) 

I午前ここで何か間違っている?

+0

どのバージョンの休止状態を使用していますか?私はバージョン3.5.6を使用しています - ファイナルと私はあなたの問題を複製することはできません。 – telm

+0

私は3.5.3バージョン – dpsdce

答えて

1

enumのsourceプロパティは、列挙マッピングとは関係ありません。 Hibernateに関する限り、データベースには値SOURCE_MANUALSOURCE_RE_EDITINGが含まれていなければなりません。値の1つにスペースが含まれているため、データベースを移行せずに通常の列挙マッピングを使用できないことがあります。いくつかのハックがあるかもしれませんが、このマッピングの文字列を使用して手動でenumに変換する方が良いと思われます。

+0

を使用していますが、それは有用ではありません。 Dhirendraがいくつかの任意の文字列を列挙型にマップしたいのであれば、そのための特殊なUserTypeを作るのが最善でしょう。 –

0

Hibernateバージョン3.5.6にアップグレードしてください。

これがうまくいかない場合は、enum名のtoString()メソッドをオーバーライドしてenum名を返すこともできますが、それは問題ではありませんが、短時間で問題を解決できます。

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

これは動作していないと私はそれがEnum.valueOf(EnumType.class、 "値")、この "マニュアル"文字列値の列挙が存在しないとして失敗する休止状態で休止状態ではないと思います。 – dpsdce