我目前正在为一个项目升级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
的同一个类中,这个结构是缺失的。而且,看起来这个类已经被重构得相当重了。
这可能是Hibernate
的4.3.9
版本的bug吗?
更新:奇怪的是,我得到完全相同的错误与Hibernate 4.3.10
和MSSQL
。
我通过引入我自己的hibernate方言来解决这个问题,它包含以下行:
registerColumnType(Types.VARBINARY, 255, "varchar(255)");