2014-09-26 43 views
0

內@Embedded我有一個複合鍵如下使用自定義的順序枚舉休眠

@Embeddable 
public class TableAPrimary implements Serializable{ 

    private Course course; 
    private int tableId; 
} 

場就在這裏

枚舉但是id的值我在數據庫中沒有映射枚舉中的序數。

例如,我有

enum Course{ 

    HISTORY(20), MATHS(100); 

    private Course(int courseId) { 
     id = courseId; 
    } 

    @Override 
    public int getId() { 
     return id; 
    } 
    private static final Map<Integer, Course> lookup = new HashMap<Integer, Course>(); 

    static { 
     for (Course courseId : Course.values()) { 
      lookup.put(courseId.getId(), courseId); 
     } 
    } 
    public static Course getById(int id) throws IllegalArgumentException{ 
     Course courseId = lookup.get(id); 

     if (courseId == null) { 
      throw new IllegalArgumentException("No course enum exists for Id " + id); 
     } 

     return courseId; 
    } 
} 

能否請你幫我設置基礎上,從custom id數據庫中正確enum@embedded

+0

那麼它是數據庫而不是序數?你試圖顯式添加@Enumerated? – 2014-09-26 20:10:25

+0

數據庫有每行的值爲20,100等。我試着添加@Enumerated,但仍然無法轉換爲正確的枚舉值。 – sreeprasad 2014-09-27 00:41:24

回答

0

休眠不允許這樣的,首先你不能在Java定義自定義的序號。從javadocs的ordinal();

返回枚舉常數的序(它在 枚舉聲明,其中初始常量被分配的 零序位置)。

其次,從休眠文件,

Hibernate標註支持開箱枚舉類型映射任一 的成序列(保存枚舉有序)或基於字符串 柱(保存枚舉字符串表示):默認爲序號的持久性 表示可以通過 @Enumerated註釋覆蓋,如註釋屬性示例中所示。

此外,你不能用數字命名字符串枚舉,所以你從name()都沒有用。 Hibernate使用ordinal or name來映射枚舉,並且都是final方法,所以枚舉沒有靈活性。

也許有一些解決辦法,但我敢打賭,他們不使用@Enumerated。 你可以做的是更新數據庫值,所有20 => 0和100 => 1,然後它將使用序號或更新所有20 => HISTORY和100 => MATH,然後它將與名稱。 (@Enumerated(EnumType.STRING)

希望我錯了。