移植为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。
谢谢, ķ。
答案 0 :(得分:1)
使用DOUBLE PRECISION
定义列时,Oracle会自动将其转换为FLOAT
,可以使用SQL语句DESCRIBE <TABLE>;
进行验证。默认情况下,Types.DOUBLE
到float
没有映射。
有关通过扩展课程Oracle10gDialect
添加此映射,请参阅Hibernate: Found: float, expected: double precision。