我使用内存HSQL(HSQLDB)与Hibernate进行所有单元测试,因为它非常快。我有一个表格,其列定义如下:
float qw;
当hibernate启动时,我收到以下错误:
org.hibernate.HibernateException: Wrong column type in MyTable for column qw.
Found: double, expected: float
为什么在列声明为double
时会找到float
?
答案 0 :(得分:10)
由于一系列不幸事件而发生这种情况。
问题始于HSQLDB不支持
float
数据类型。 (呃?是的,我知道,但是Documentation
here。)
由于HSQLDB的存在,问题开始变得难看
指定float
列时,不仅仅是 失败 ,而是
默默地将其重新解释为double
,假装为
不知情的程序员,一切都很顺利。所以,在你的
您可以将create table
语句指定为列的类型
float
,HSQLDB会成功,但它只是在拖你,
因为如果你以后查询该列的类型,你会发现
它是double
,而不是float
。
然后,稍后,hibernate会发现此列为double
期望它是float
,并且它不够聪明,无法利用这一事实
来自float
的{{1}} 可分配。每个人都知道double
比double
更好,所以
hibernate实际上应该高兴它发现了float
所需要的只是一个double
,对吧? - 但不,hibernate不会有任何
那:当它需要float
时,除了float
之外什么都可以。
然后,有一个关于hibernate的有趣的事情
对HSQLDB的内置支持,其中包括一个
float
,
但 方言并不关心你的花车。 所以,他们不会
认为数据类型不兼容是一个方言问题?他们
从未用浮子测试过它?我不知道该怎么想,但是
问题的真相是HSQLDB的hibernate方言
没有对此问题进行任何更正。
那么,我们能做什么?
问题的一个可能解决方案是为HSQLDB创建我们自己的hibernate方言,我们在其中纠正这种差异。
在过去,我遇到了类似MySQL和class org.hibernate.dialect.HSQLDialect
与boolean
的问题,(请参阅此问题:"Found: bit, expected: boolean" after Hibernate 4 upgrade)所以对于HSQLDB我解决了问题{{1通过为hibernate声明我自己的HSQLDB方言来对抗bit
:
float
使用如下:
double