gpt4 book ai didi

java - HSQL + Hibernate 预期异常 : Wrong column type: Found: double,: float

转载 作者:行者123 更新时间:2023-11-29 16:05:58 24 4
gpt4 key购买 nike

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

float qw;

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

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

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

最佳答案

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

  1. 问题始于 HSQLDB 不支持float 数据类型。

    (呃?是的,我知道,但是 Documentationhere 。)

  2. 由于 HSQLDB 确实如此,问题开始变得丑陋当您指定 float 列时,不仅仅是失败,而是默默地将其重新解释为double。如果稍后查询类型的那一列,你会发现它不是float,它是

    程序员应用他们的误导的典型例子“防御性编程”的概念,造成的麻烦远比他们正在储蓄。 HSQLDB本质上是假装毫无戒心的程序员认为一切都很顺利,但这只是恶搞他们:一切都不顺利,还会有麻烦。

  3. 然后,稍后,hibernate 发现此列是 double,而它期望它是 float,但它不够聪明,无法知道这一点float 可以从 double 分配,因此失败。

    每个人都知道doublefloat更好,所以hibernate 实际上应该高兴它发现了一个double while它所需要的只是一个float,对吗? --但是不,hibernate 不会具有其中任何一个:当它需要一个 float 时,除了一个 float 之外什么都没有就可以了。

  4. 然后,据说 hibernate 有一个有趣的事情对 HSQLDB 的内置支持,事实证明它包含一个类 org.hibernate.dialect.HSQLDialect,但是方言不处理 float 。

    因此,他们不认为数据类型不兼容是一个问题方言问题?他们从来没有用浮标测试过它?我不知道什么假设,但事实是 hibernateHSQLDB 的方言没有为此提供任何更正问题。

那么,我们能做什么呢?

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

过去,我在 MySQL 和 booleanbit 中遇到了类似的问题(参见这个问题:"Found: bit, expected: boolean" after Hibernate 4 upgrade),所以对于 HSQLDB 我解决了这个问题通过声明我自己的 Hibernate 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();

关于java - HSQL + Hibernate 预期异常 : Wrong column type: Found: double,: float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55745620/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com