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