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
.
以外的任何原因
查看之前版本的Hibernate
、4.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 似乎已经进行了大量重构。
这可能是 Hibernate
的 4.3.9
版本中的错误吗?
更新:奇怪的是,我在使用 Hibernate 4.3.10
和 MSSQL
.
时遇到了完全相同的错误
我通过引入我自己的 Hiberante 方言解决了这个问题,其中包含以下行:
registerColumnType(Types.VARBINARY, 255, "varchar(255)");
虽然更多的是解决方法而不是修复..
我目前正在为一个项目升级 Hibernate,从 3.x 升级到 4.3.9,我 运行 遇到了一些奇怪的错误。我在实体中有几个枚举值,都映射为 @Enumerated(EnumType.STRING)
。在以前的 Hibernate 版本中,这将被映射为 VARCHAR(255)
。但是现在,使用 MySQL,Hibernate 尝试将其映射为 tinyblob
,这使得验证失败。
据我从 MySQLDialect
中得知的情况,Hibernate 认为这是 tinyblob
的唯一方法是类型映射到 Types.VARBINARY
。但我真的看不出将其映射为 VARCHAR
.
查看之前版本的Hibernate
、4.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 似乎已经进行了大量重构。
这可能是 Hibernate
的 4.3.9
版本中的错误吗?
更新:奇怪的是,我在使用 Hibernate 4.3.10
和 MSSQL
.
我通过引入我自己的 Hiberante 方言解决了这个问题,其中包含以下行:
registerColumnType(Types.VARBINARY, 255, "varchar(255)");
虽然更多的是解决方法而不是修复..