我将内存中的HSQL(HSQLDB)与Hibernate一起用于所有单元测试,因为它非常快。我有一个表,其中的列定义如下:
float qw;
hibernate启动时,出现以下错误:
org.hibernate.HibernateException: Wrong column type in MyTable for column qw.
Found: double, expected: float
为什么double
在将列声明为时找到float
?
这是由于 一系列不幸事件而发生的 。
问题始于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方言,在其中我们纠正了这一差异。
在过去,我遇到了MySQL和boolean
vs.的类似问题bit
,因此对于HSQLDB,我通过html" target="_blank">声明自己的HSQLDB方言来解决了float
vs.问题。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();
问题内容: Oracle Float双精度数据类型到Java Double数据类型的映射存在问题。使用Java Double数据类型时,hibernate模式验证器似乎失败。 避免这种情况的唯一方法是禁用架构验证,并希望架构与即将运行的应用程序同步。在投入生产之前,必须对其进行修复。 应用程序的环境: -Grails 1.2.1 -Hibernate-core 3.3.1.GA -Oracle 1
问题内容: 是否有比浮点精度更好的数据类型? 问题答案: 小数数据类型 与基于硬件的二进制浮点数不同,十进制模块具有用户可更改的精度(默认为28位),可以与给定问题所需的精度一样大。 如果您对性能问题感到困扰,请查看GMPY
问题内容: 如何使用正则表达式从字符串中提取双精度值。 问题答案: 这是简单的方法。请勿将regex用于内置类型。
为什么浮点数据类型的精度不与其大小成正比增长?例如: 正如您所看到的,的精度大约是精度的两倍,这是有意义的,因为的大小是。 但这与双精度和长双精度的情况不同,长双精度的大小是128位,是64位双精度的两倍,但其精度只多出三位!! 我不知道浮点数是如何实现的,但从理性的角度来看,仅为三位精度使用64位内存是否有意义?! 我四处搜索,但没有找到一个简单明了的答案。如果有人能解释为什么长双精度只比双精度
问题内容: 如何使用正则表达式从字符串中提取双精度值。 问题答案: 是简单的方法。请勿将regex用于内置类型。
本文向大家介绍C#浮点,双精度,十进制,包括了C#浮点,双精度,十进制的使用技巧和注意事项,需要的朋友参考一下 示例 浮动 float是.NET数据类型的别名System.Single。它允许存储IEEE 754单精度浮点数。存在此数据类型mscorlib.dll,每个C#项目在创建它们时都会隐式引用该数据类型。 大致范围:-3.4×10 38至3.4×10 38 十进制精度:6-9个有效数字 记