2011-09-29 75 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