Hibernate:发现:float,expected:double precision

时间:2010-03-26 16:36:13

标签: hibernate validation grails database-schema

我对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

8 个答案:

答案 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)
    }
}

因此它将在验证模式下消除错误。