【问题标题】:HSQL + Hibernate Exception: Wrong column type: Found: double, expected: floatHSQL + Hibernate 异常:错误的列类型:找到:double,预期:float
【发布时间】:2015-04-13 09:07:29
【问题描述】:

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

float qw;

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

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

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

【问题讨论】:

    标签: java hibernate hsqldb


    【解决方案1】:

    这是由于一系列不幸事件而发生的。

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

    2. 问题开始变得丑陋,因为 HSQLDB 确实 当您指定 float 列时,不仅仅是失败,而是 默默地重新解释为double,假装 毫无戒心的程序员,一切都很顺利。所以,在你的 create table 语句,您可以将列的类型指定为 float,HSQLDB 会成功,但它只是在欺骗你, 因为如果你稍后查询该列的类型,你会发现 是double,而不是float

    3. 然后,稍后,hibernate 发现此列是double,而它 期望它是float,它不够聪明,无法利用这个事实 float 可从double 分配。大家都知道doublefloat 好,所以 hibernate 实际上应该 高兴 它找到了一个 double 而 它所需要的只是float,对吗? --但是不,hibernate 不会有任何 那:当它期望 float 时,除了 float 什么都行。

    4. 然后,据说休眠有一个有趣的事情 对 HSQLDB 的内置支持,事实证明它包含一个 class org.hibernate.dialect.HSQLDialect, 但方言不关心你的花车。所以,他们不关心 相信数据类型不兼容是方言问题吗?他们 从来没有用花车测试过?我不知道该怎么假设,但是 事情的真相是 HSQLDB 的休眠方言确实 没有针对这个问题提供任何更正。

    那么,我们能做些什么呢?

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

    在过去,我遇到了与 MySQL 和 booleanbit 类似的问题,(请参阅此问题:"Found: bit, expected: boolean" after Hibernate 4 upgrade)所以对于 HSQLDB,我通过 floatdouble 解决了这个问题为休眠声明我自己的 HSQLDB 方言:

    /**
     * '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();
    

    【讨论】:

      猜你喜欢
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 2015-01-12
      • 2021-07-10
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      • 2021-09-15
      相关资源
      最近更新 更多