基于GenericEnumUserType的列上的hbm2ddl

时间:2009-12-01 13:44:49

标签: hibernate jpa hbm2ddl

以下JPA列定义默认在所有数据库上生成“整数”数据类型(例如h2,mysql,postgres)

@Column(name = "type", nullable = false)
@Type(type = "com.mycompany.hibernate.usertype.GenericEnumUserType", parameters = {
        @Parameter(name = "enumClass", value = "com.mycompany.model.DegreeType"),
        @Parameter(name = "identifierMethod", value = "toInt"),
        @Parameter(name = "valueOfMethod", value = "fromInt") })
@NotNull
private DegreeType type;

我想为此字段使用最小存储空间,因此更愿意使用columnDefinition参数进行schema2ddl生成。但看起来像postgres不支持tinyint,但在上面提到的其他数据库中都支持。

是否可以根据数据库类型生成不同的SQL文件。 1.实现这一目标的最佳方法是什么? 2.什么是可用于此目的的最佳数据类型(具有最小存储量)?那会是小事吗

1 个答案:

答案 0 :(得分:2)

由于您使用的是自定义类型(为什么?),因此将根据您的类型sqlTypes()方法的结果生成基础列定义。实际的SQL列类型将从适当的Dialect获得。

因此,如果sqlTypes()要返回new int[] {Types.TINYINT},PostgresQL方言会将其映射到int2,将H2 / MySQL映射到tinyint

所有这一切,我会一般建议:

  1. 通过@Enumerated注释使用built-in enum support
  2. 将枚举值存储为字符串而不是整数。使用后者确实节省了一些空间,但它引入了一个巨大的潜在问题:3个月(几年),有人通过在你的类型中间插入另一个枚举常量来改变代码,突然你的所有数据都变得无效。磁盘空间便宜;处理这样的问题不是。

    @Enumerated(EnumType.STRING)
    @Column(name = "degree_type", nullable = false, length=!0)
    private DegreeType type;