11

我在将 Oracle Float 双精度数据类型映射到 Java Double 数据类型时遇到问题。当使用 Java Double 数据类型时,休眠模式验证器似乎失败了。

org.hibernate.HibernateException: Wrong column type in DB.TABLE for column amount. Found: float, expected: double precision

避免这种情况的唯一方法是禁用模式验证,并希望模式与即将运行的应用程序同步。它必须在投入生产之前修复。

应用程序的环境:
- Grails 1.2.1
- Hibernate-core 3.3.1.GA
- Oracle 10g

4

8 回答 8

13

除非您在 DDL 文件中定义列类型,否则double precisionOracle 会将其转换为float列类型。所以你需要在方言类中注册双精度为浮点列类型。

public class Oracle10gDialectExtended extends Oracle10gDialect {

    public Oracle10gDialectExtended() {
        super();
        registerColumnType(Types.DOUBLE, "float");
    }
}

最后Oracle10gDialectExtended在 Hibernate/JPA 配置中注册为hibernate.dialect.

于 2012-11-07T14:48:38.603 回答
5

如果您使用的是 Annotation 方法,则需要为该字段声明如下的列类型。

@Column(name = "PERFORMANCE", columnDefinition = "FLOAT(5,2)")
private double performance;
于 2015-07-14T13:43:47.767 回答
4

需要更多信息。桌子是双人的?我不熟悉 Oracle,但那是浮点类型吗?它翻译成什么java.sql.Types类型​​?您可以在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" );

Types.FLOAT预期的 java 类型通常会映射到float; 单个精度值。

最简单的方法是更改​​您的表或 java 类以匹配。或者,您可以指定将单精度值映射到双精度值的用户类型;我想不出你为什么真的想这样做,但也许如果你不能同时控制班级和桌子,我想这种情况很少见。

hth。

于 2010-03-26T16:51:20.620 回答
2

我们有同样的问题。我们通过确保在映射中明确设置列类型来解决它,如下所示:

<property name="performance" type="double">
  <column name="PERFORMANCE" sql-type="float" />
</property>
于 2010-08-18T12:39:25.540 回答
1

应用程序属性

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");
    }
}
于 2019-06-05T09:32:06.117 回答
0

我有一个案例,我的 Oracle 列类型是NUMBER,Java 类型是double.

终于追查到是设置问题

<property name="hbm2ddl.auto">validate</property>

刚改成

<property name="hbm2ddl.auto">update</property>

一切正常!

于 2012-06-26T17:30:58.337 回答
0

经过大量的研究和尝试,我找到了解决方案。对于 Grails 域,我们可以通过将sqlType 添加为“float”以用于验证模式来解决此问题。

Result.groovy

class Result{
    Double discount

    static mapping = {
        discount column: "discount", sqlType: "float"
    }

    static constraints = {
        discount(nullable: true)
    }
}

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

于 2019-12-19T09:55:11.623 回答
-1

我在将 jboss 4/hibernate 3 应用程序迁移到 as7/hibernate4 时遇到了这个问题。Rob Keilty 建议将 hbm2ddl.auto 从 validate 更改为 update 而无需更改遗留代码,从而解决了问题。

于 2013-08-18T22:46:27.797 回答