Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa 如何控制枚举的列大小?_Jpa_Jpa 2.0 - Fatal编程技术网

Jpa 如何控制枚举的列大小?

Jpa 如何控制枚举的列大小?,jpa,jpa-2.0,Jpa,Jpa 2.0,这是通过JPA使用EclipseLink,我让它为我创建表格。后端数据库是Derby for development模式,我希望使用MySQL或其他方式进行部署 在我的实体中,我有一个枚举: @Entity public class Thing implements Serializable { public enum Choice { Able, Baker, Charlie, Delta } @Column(precision = 1) private Choic

这是通过JPA使用EclipseLink,我让它为我创建表格。后端数据库是Derby for development模式,我希望使用MySQL或其他方式进行部署

在我的实体中,我有一个枚举:

@Entity
public class Thing implements Serializable {

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

    @Column(precision = 1)
    private Choice  choiceValue;

    // etc
}
枚举序号只需要一个数字,但创建表时,它会为其分配10个数字。所以一百万条记录将浪费9兆字节。忽略“精度=1”项


有没有办法让它只使用一个字节对枚举进行编码?

在Derby&EclipseLink中映射枚举的整数列中设置比例或精度没有帮助。它什么也不做,你最终还是会得到整数。你可以有更多的控制与以下

@Column(columnDefinition = "SMALLINT") //smallint= 2 bytes or
//@Column(columnDefinition = "NUMERIC(1)") //
private Choice  choiceValue;
这对我来说很有效,但基本上,NUMERIC的Java类型是BigDecimal,SMALLINT的缩写是BigDecimal,这在某些情况下可能会产生问题。例如,本机查询将为choiceValue列返回BigDecimal


需要多少存储空间取决于数据库提供程序,每位数存储一些较旧的MySQL字符,现在它似乎已经进行了很好的调整:我不知道它在Derby中到底是如何实现的,但我认为它不会占用超过字节的空间。

好的,我刚刚尝试了这个方法,效果很好。我的理解正确吗?数值(1)定义在SQL数据库中可能只占用一个字节,但在JVM中被实例化为BigDecimal对象?columnDefinition=“NUMERIC(1)”MySQL是特定的还是足够通用,可以在其他DBMS上工作?例如,Oracle使用“NUMBER(1)”代替。NUMERIC是标准的SQL数据类型。