HSQL + Hibernate异常:列类型错误:找到:double,expected:float

时间:2015-02-12 14:59:00

标签: java hibernate hsqldb

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

float qw;

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

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

为什么在列声明为double时会找到float

1 个答案:

答案 0 :(得分:10)

由于一系列不幸事件而发生这种情况。

  1. 问题始于HSQLDB不支持 float数据类型。 (呃?是的,我知道,但是Documentation here。)

  2. 由于HSQLDB的存在,问题开始变得难看 指定float列时,不仅仅是 失败 ,而是 默默地将其重新解释为double,假装为 不知情的程序员,一切都很顺利。所以,在你的 您可以将create table语句指定为列的类型 float,HSQLDB会成功,但它只是在拖你, 因为如果你以后查询该列的类型,你会发现 它是double,而不是float

  3. 然后,稍后,hibernate会发现此列为double 期望它是float,并且它不够聪明,无法利用这一事实 来自float的{​​{1}} 可分配。每个人都知道doubledouble更好,所以 hibernate实际上应该高兴它发现了float 所需要的只是一个double,对吧? - 但不,hibernate不会有任何 那:当它需要float时,除了float之外什么都可以。

  4. 然后,有一个关于hibernate的有趣的事情 对HSQLDB的内置支持,其中包括一个 float, 但 方言并不关心你的花车。 所以,他们不会 认为数据类型不兼容是一个方言问题?他们 从未用浮子测试过它?我不知道该怎么想,但是 问题的真相是HSQLDB的hibernate方言 没有对此问题进行任何更正。

  5. 那么,我们能做什么?

    问题的一个可能解决方案是为HSQLDB创建我们自己的hibernate方言,我们在其中纠正这种差异。

    在过去,我遇到了类似MySQL和class org.hibernate.dialect.HSQLDialectboolean的问题,(请参阅此问题:"Found: bit, expected: boolean" after Hibernate 4 upgrade)所以对于HSQLDB我解决了问题{{1通过为hibernate声明我自己的HSQLDB方言来对抗bit

    float

    使用如下:

    double