/**
* '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" );
}
}
1条答案
按热度按时间oyxsuwqo1#
这是由于一系列不幸事件造成的。
1.问题源于HSQLDB不支持
float
数据类型。(Duh是的,我知道,但是。
1.这个问题开始变得很棘手,因为当您指定
float
列时,HSQLDB并不是简单地***失败***,而是将其重新解释为double
。如果您稍后查询该列的类型,您会发现它不是float
,而是double
。这是程序员应用他们错误的"防御性编程"概念的典型例子,造成的麻烦远远超过了他们所节省的麻烦。HSQLDB本质上是在向不知情的程序员假装一切都很顺利,但它只是在欺骗他们:一切都不顺利,会有麻烦的。
1.然后,后来hib发现这个列是
double
,而它期望它是float
,并且它不够聪明,不知道float
* 可以从double
赋值,所以它失败了。每个人都知道
double
比float
更好,所以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休眠方言解决了float
与double
的问题:并按如下方式使用它: