默认情况下,以下 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.可用于此目的的最佳数据类型(具有最小存储空间)是什么?那会很小吗

有帮助吗?

解决方案

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

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

说了这么多,我愿意 一般来说 推荐给:

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

    @Enumerated(EnumType.STRING)
    @Column(name = "degree_type", nullable = false, length=!0)
    private DegreeType type;
    
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top