java HSQL + Hibernate异常错误:错误的列类型:发现:双精度,预期:浮动

w41d8nur  于 2023-02-20  发布在  Java
关注(0)|答案(1)|浏览(130)

我在所有的单元测试中使用内存中的HSQL(HSQLDB)和Hibernate,因为它非常快。我有一个表,其中的列定义如下:

float qw;

当休眠启动时,我收到以下错误:

org.hibernate.HibernateException: Wrong column type in MyTable for column qw. 
Found: double, expected: float

当列声明为float时,为什么它会找到double

oyxsuwqo

oyxsuwqo1#

这是由于一系列不幸事件造成的。
1.问题源于HSQLDB不支持float数据类型。
(Duh是的,我知道,但是。
1.这个问题开始变得很棘手,因为当您指定float列时,HSQLDB并不是简单地***失败***,而是将其重新解释为double。如果您稍后查询该列的类型,您会发现它不是float,而是double
这是程序员应用他们错误的"防御性编程"概念的典型例子,造成的麻烦远远超过了他们所节省的麻烦。HSQLDB本质上是在向不知情的程序员假装一切都很顺利,但它只是在欺骗他们:一切都不顺利,会有麻烦的。
1.然后,后来hib发现这个列是double,而它期望它是float,并且它不够聪明,不知道float * 可以从double赋值,所以它失败了。
每个人都知道doublefloat更好,所以hib实际上应该为它找到了double而高兴,而它所需要的只是一个float,对吗?--但是不,hib不会有任何这样的东西:当它期望float时,除了float之外什么也不能做。
1.还有一件有趣的事情,据说Hibernate内置了对HSQLDB的支持,事实证明它包含了一个class org.hibernate.dialect.HSQLDialect,但是***这种方言并不关心浮点数。***
所以,他们不相信数据类型不兼容是一个方言问题?他们从来没有用浮点数测试过它?我不知道该怎么假设,但事实是HSQLDB的Hibernate方言没有为这个问题提供任何纠正。
那么,我们能做些什么呢?
这个问题的一个可能的解决方案是为HSQLDB创建我们自己的Hibernate方言,我们在其中纠正了这种差异。
在过去,我遇到了类似的问题,MySQL和boolean vs. bit,(见此问题:"Found: bit, expected: boolean" after Hibernate 4 upgrade),所以对于HSQLDB,我通过声明自己的HSQLDB休眠方言解决了floatdouble的问题:

/**
 * 'Fixed' HSQL Dialect.
 *
 * PEARL: HSQL seems to have a problem with floats.  We remedy this here.
 * See https://stackoverflow.com/q/28480714/773113
 *
 * PEARL: this class must be public, not package-private, and it must have a 
 * public constructor, otherwise hibernate won't be able to instantiate it.
 */
public class FixedHsqlDialect extends HSQLDialect
{
    public FixedHsqlDialect()
    {
        registerColumnType( java.sql.Types.FLOAT, "double" );
    }
}

并按如下方式使用它:

ejb3cfg.setProperty( "hibernate.dialect", FixedHsqlDialect.class.getName() );
    //Instead of: org.hibernate.dialect.HSQLDialect.class.getName();

相关问题