我正在将 Hibernate 从
6.1.7
升级到 6.5.2
,我的实体中有许多枚举列标记为
@Enumerated(EnumType.ORDINAL)
。我的代码库必须同时针对 Oracle 和 SQL Server 运行。
问题是 Hibernate 中将枚举从
SMALLINT
映射到 TINYINT
(如果枚举只有很少的值)。
我已经将 Oracle 的数据库模式固定为 NUMBER(10, 0)
,将 SQL Server 的序数枚举固定为 INT
。
我似乎找不到使用可同时适用于两个数据库的注释来映射枚举的解决方案。 目前它适用于 Oracle,但 SQL Server 的模式验证会抛出:
架构验证:表 [XXX] 中的列 [XXXX] 遇到错误的列类型; 找到了 [int (Types#INTEGER)],但期望 [smallint (Types#SMALLINT)]
知道如何解决这个问题吗?
我尝试添加
@JdbcTypeCode(Types.SMALLINT)
,同样的错误。
另外 @Column(columnDefinition = "int")
修复了 SQL Server,但 Oracle 在模式验证方面开始失败:
架构验证:表 [m_acc_cert_campaign] 中的列 [definitionRef_targetType] 遇到错误的列类型; 找到了 [number (Types#NUMERIC)],但期待 [int (Types#TINYINT)]
解决方案是这样注释:
@JdbcType(IntegerJdbcType.class)
@Enumerated(EnumType.ORDINAL)
@JdbcType
将强制 SqlTypes.SMALLINT
,因为它之前直接在 EnumJavaType
中实现。