2

以下 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. 可用于此目的的最佳数据类型(存储最少)是什么?那会很小吗

4

1 回答 1

2

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

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

综上所述,我通常建议:

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

    @Enumerated(EnumType.STRING)
    @Column(name = "degree_type", nullable = false, length=!0)
    private DegreeType type;
    
于 2009-12-01T17:58:29.257 回答