2011-09-29 83 views
0

這是通過JPA與EclipseLink,我讓它爲我創建表。後端數據庫是用於開發模式的Derby,我希望使用MySQL或其他部件進行部署。如何控制枚舉的列大小?

在我的實體我有一個枚舉:

@Entity 
public class Thing implements Serializable { 

    public enum Choice { Able, Baker, Charlie, Delta } 

    @Column(precision = 1) 
    private Choice choiceValue; 

    // etc 
} 

枚舉序只需要一個數字,但表被創建時,它分配10位吧。所以一百萬條記錄會浪費9兆字節。 「精度= 1」項被忽略。

有沒有辦法讓它只用一個字節來編碼枚舉?

回答

1

設置Enum在Derby中映射的Integer列的比例或精度& EclipseLink沒有幫助。它什麼都不做,你最終會以INTEGER結束。您可以通過以下方式進行更多控制。

@Column(columnDefinition = "SMALLINT") //smallint= 2 bytes or 
//@Column(columnDefinition = "NUMERIC(1)") // 
private Choice choiceValue; 

它已經爲我工作,但基本上Java類型對於數值是BigDecimal和爲SMALLINT短,也許能產生在某些情況下的問題。例如,本地查詢將返回BigDecimal作爲choiceValue-column。

需要多少存儲空間取決於數據庫提供程序的位數,一些較老的MySQL存儲每個數字的字符數,現在看起來很微調:http://dev.mysql.com/doc/refman/5.0/en/precision-math-decimal-changes.html我不知道它究竟是如何在Derby中,但我會假設它沒有超過字節。

+0

好吧,我只是試過這個,它的工作。我理解NUMERIC(1)定義可能只需要SQL數據庫中的一個字節,但在JVM中實例化爲BigDecimal對象? – AlanObject