Hibernate 4.3.9 和映射枚举

Hibernate 4.3.9 and mapping enums

我目前正在为一个项目升级 Hibernate,从 3.x 升级到 4.3.9,我 运行 遇到了一些奇怪的错误。我在实体中有几个枚举值,都映射为 @Enumerated(EnumType.STRING)。在以前的 Hibernate 版本中,这将被映射为 VARCHAR(255)。但是现在,使用 MySQL,Hibernate 尝试将其映射为 tinyblob,这使得验证失败。

据我从 MySQLDialect 中得知的情况,Hibernate 认为这是 tinyblob 的唯一方法是类型映射到 Types.VARBINARY。但我真的看不出将其映射为 VARCHAR.

以外的任何原因

查看之前版本的Hibernate4.1.1时,可以看到SimpleValueBinder中的代码如下:

if ( enumType != null ) {
    if ( javax.persistence.EnumType.ORDINAL.equals( enumType ) ) {
        typeParameters.setProperty( EnumType.TYPE, String.valueOf( Types.INTEGER ) );
}
else if ( javax.persistence.EnumType.STRING.equals( enumType ) ) {
    typeParameters.setProperty( EnumType.TYPE, String.valueOf( Types.VARCHAR ) );
}
else {
    throw new AssertionFailure( "Unknown EnumType: " + enumType );
}

这是有道理的,并且会使类型成为 VARCHAR。但是,在 4.3.9 的同一个 class 中,缺少此构造。此外,class 似乎已经进行了大量重构。

这可能是 Hibernate4.3.9 版本中的错误吗?

更新:奇怪的是,我在使用 Hibernate 4.3.10MSSQL.

时遇到了完全相同的错误

我通过引入我自己的 Hiberante 方言解决了这个问题,其中包含以下行:

registerColumnType(Types.VARBINARY, 255, "varchar(255)");

虽然更多的是解决方法而不是修复..