Oracle 11g中的Hibernate和DOUBLE

时间:2014-06-30 20:22:38

标签: java oracle hibernate

移植为Sybase和Hibernate 3.6.4编写的应用程序以开始使用Oracle 11g。据我所知,人们可以使用Oracle10gDialect让Hibernate使用Oracle 11g。我正在使用它,但是对于映射到java.lang.Double的其中一列我遇到了问题。

当我创建列为BINARY_DOUBLE的表时,hibernate抱怨说:

  

引起:org.hibernate.HibernateException:错误的列类型   列PERCENTAGE的TEST_SCHEMA.TEST_TABLE。找到了:binary_double,   预期:双精度

当我将列定义为DOUBLE PRCEISION时,它抱怨说:

  

引起:org.hibernate.HibernateException:错误的列类型   列PERCENTAGE的TEST_SCHEMA.TEST_TABLE。发现:浮动,预计:   双精度

查看文档这两个错误都有意义,因为Oracle中没有Double数据类型。但是看看方言代码,我不确定为什么我会看到第二个错误。

类org.hibernate.dialect.Oracle8iDialect有这个方法有"双精度"映射到Types.DOUBLE

protected void registerNumericTypeMappings() {
    registerColumnType( Types.BIT, "number(1,0)" );
    registerColumnType( Types.BIGINT, "number(19,0)" );
    registerColumnType( Types.SMALLINT, "number(5,0)" );
    registerColumnType( Types.TINYINT, "number(3,0)" );
    registerColumnType( Types.INTEGER, "number(10,0)" );

    registerColumnType( Types.FLOAT, "float" );
    registerColumnType( Types.DOUBLE, "double precision" );
    registerColumnType( Types.NUMERIC, "number($p,$s)" );
    registerColumnType( Types.DECIMAL, "number($p,$s)" );
}

所以,我不确定为什么DOUBLE PRECISION不适合我。关于我在这里做错了什么的任何指示。我确定那些测试过Oracle11gDialect的人会在他们的代码中使用Double。

谢谢, ķ。

1 个答案:

答案 0 :(得分:1)

使用DOUBLE PRECISION定义列时,Oracle会自动将其转换为FLOAT,可以使用SQL语句DESCRIBE <TABLE>;进行验证。默认情况下,Types.DOUBLEfloat没有映射。

有关通过扩展课程Oracle10gDialect添加此映射,请参阅Hibernate: Found: float, expected: double precision