您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

HSQL + Hibernate异常:错误的列类型:发现:双精度,预期:浮点型

HSQL + Hibernate异常:错误的列类型:发现:双精度,预期:浮点型

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

问题始于HsqlDB不支持float数据类型的事实 。(是吗?是的,我知道,但是这里的文档。)

由于HsqlDB 在指定列时不会简单 float,而是将其地重新解释为double,从而使毫无疑问的程序员认为一切正常,这一问题开始变得棘手。因此,create table您可以在 语句中将列的类型指定为 float,HsqlDB将成功,但这只会引发您的麻烦,因为如果以后查询该列的类型,则会发现它double不是float

然后,hibernate后来发现此列为double,而期望它为float,并且它不够聪明,无法利用float 从中 分配 的事实double。每个人都知道a double 比a更好float,因此hibernate状态应该很 高兴 它发现double所需的时间只是a float,对吗?-但是没有,hibernate不会有任何事情:当它期望a时float,只有a float会做。

然后,关于hibernate有一个有趣的事情,据说它具有对HsqlDB的内置支持,事实证明它包含一个 class org.hibernate.dialect.HsqlDialect,但 因此,他们不认为数据类型不兼容是方言问题吗?他们从未用浮子测试过吗?我不知道该怎么办,但事实是HsqlDB的hibernate方言无法解决此问题。

所以,我们能做些什么?

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

在过去,我遇到了MysqLbooleanvs.的类似问题bit,因此对于HsqlDB,我通过声明自己的HsqlDB方言来解决floatvs.问题。double对于hibernate:

/**
 * '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();
SQLServer 2022/1/1 18:14:46 有640人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶