我对Oracle Float双精度数据类型到Java Double数据类型的映射存在问题。当使用Java Double数据类型时,hibernate模式验证器似乎失败。
org.hibernate.HibernateException: Wrong column type in DB.TABLE for column amount. Found: float, expected: double precision
避免这种情况的唯一方法是禁用架构验证,并希望架构与即将运行的应用程序保持同步。它必须在投入生产之前修复。
App的环境:
- Grails 1.2.1
- Hibernate-core 3.3.1.GA
- Oracle 10g
答案 0 :(得分:9)
除非您在DDL文件中将列类型定义为double precision
,否则Oracle会将其转换为float
列类型。所以你需要在方言类中注册double作为浮点列类型。
public class Oracle10gDialectExtended extends Oracle10gDialect {
public Oracle10gDialectExtended() {
super();
registerColumnType(Types.DOUBLE, "float");
}
}
最后在Hibernate / JPA配置中将Oracle10gDialectExtended
注册为hibernate.dialect
。
答案 1 :(得分:4)
需要更多信息。桌子是Double?我不熟悉Oracle,但它是浮点类型吗?它转换为java.sql.Types
类型的是什么?您可以在数据库的dialect类中看到java.sql.Types
到数据库类型映射。在这种情况下,它是org.hibernate.dialect.Oracle10gDialect
(扩展9i和8i)。看起来你有
registerColumnType( Types.DOUBLE, "double precision" );
因此,需要将表定义为double precision
,并且需要将java类定义为映射到Types.Double
的内容,通常为double
。
从错误消息中,您的表定义为float
,它将使用此映射
registerColumnType( Types.FLOAT, "float" );
预期的java类型将映射到Types.FLOAT
,通常为float
;单精度值。
最简单的方法是更改表或java类以匹配。或者,您可以指定将单个精度值映射到双精度值的用户类型;我想不出为什么你真的想要这样做,但也许如果你没有控制课堂和桌子,这是非常罕见的,我想。
第h
答案 2 :(得分:3)
如果您使用的是Annotation方法,则需要为该字段声明以下列类型。
@Column(name = "PERFORMANCE", columnDefinition = "FLOAT(5,2)")
private double performance;
答案 3 :(得分:1)
我们遇到了同样的问题。我们通过确保在映射中显式设置列类型来解决它,如下所示:
<property name="performance" type="double">
<column name="PERFORMANCE" sql-type="float" />
</property>
答案 4 :(得分:0)
我遇到的情况是我的Oracle列类型为NUMBER
且Java类型为double
。
最后追溯到设置
<property name="hbm2ddl.auto">validate</property>
刚刚将其更改为
<property name="hbm2ddl.auto">update</property>
一切正常!
答案 5 :(得分:0)
将jboss 4 / hibernate 3应用程序迁移到as7 / hibernate4时出现此问题。 Rob Keilty建议将hbm2ddl.auto从validate更改为update而不必更改遗留代码。
答案 6 :(得分:0)
application.properties
hibernate.dialect=com.test.config.Oracle10gDialectExtended
创建课程
package com.test.config;
import java.sql.Types;
import org.hibernate.dialect.Oracle10gDialect;
public class Oracle10gDialectExtended extends Oracle10gDialect {
public Oracle10gDialectExtended() {
registerColumnType(Types.DOUBLE, "float");
}
}
答案 7 :(得分:0)
经过大量研究和尝试,我找到了解决方案。对于Grails域,我们可以通过为验证模式添加 sqlType作为“ float” 来解决此问题。
在Result.groovy
class Result{
Double discount
static mapping = {
discount column: "discount", sqlType: "float"
}
static constraints = {
discount(nullable: true)
}
}
因此它将在验证模式下消除错误。