我目前正在为一个项目升级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
中,缺少此构造。此外,看起来这个类已经被重构了很多。
这可能是4.3.9
版本Hibernate
中的错误吗?
更新:奇怪的是,我在使用Hibernate 4.3.10
和MSSQL
时遇到了完全相同的错误。
答案 0 :(得分:0)
我通过介绍我自己的Hiberante方言来解决这个问题,包含以下几行:
registerColumnType(Types.VARBINARY, 255, "varchar(255)");
更多的解决方法而不是修复,但是..