基于 GenericEnumUserType 的列上的 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.可用于此目的的最佳数据类型(具有最小存储空间)是什么?那会很小吗
解决方案
由于您使用的是自定义类型(为什么?),基础列定义将根据您的类型的结果生成 sqlTypes()
方法。实际的 SQL 列类型将从适当的 Dialect
.
因此,如果 sqlTypes()
要返回 new int[] {Types.TINYINT}
, ,PostgresQL 方言会将其映射到 int2
和 H2 / MySQL 到 tinyint
.
说了这么多,我愿意 一般来说 推荐给:
- 使用 内置枚举支持 通过
@Enumerated
注解。 将枚举值存储为 细绳 而不是整数。使用后者确实节省了一些空间,但它引入了一个巨大的潜在问题:3 个月(几年)后,有人通过在您的类型中间插入另一个枚举常量来更改代码,突然间所有数据都变得无效。磁盘空间便宜;处理这样的问题不是。
@Enumerated(EnumType.STRING) @Column(name = "degree_type", nullable = false, length=!0) private DegreeType type;
不隶属于 StackOverflow