Hibernate:发现:float,expected:double precision

Fre*_*rin 9 validation grails hibernate database-schema

我有一个问题,Oracle Float双精度数据类型映射到Java双数据类型.使用Java Double数据类型时,hibernate架构验证程序似乎失败.

org.hibernate.HibernateException: Wrong column type in DB.TABLE for column amount. Found: float, expected: double precision
Run Code Online (Sandbox Code Playgroud)

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

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

小智 10

除非您double precision在DDL文件中定义列类型,否则Oracle会将其转换为float列类型.因此,您需要在dialect类中将double注册为float列类型.

public class Oracle10gDialectExtended extends Oracle10gDialect {

    public Oracle10gDialectExtended() {
        super();
        registerColumnType(Types.DOUBLE, "float");
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Jef*_*ker 5

需要更多信息。桌子是双人的?我对Oracle不熟悉,但那是浮点类型吗?java.sql.Types它翻译成什么类型​​?您可以java.sql.Types在数据库的方言类中看到到数据库类型的映射。在本例中是这样的org.hibernate.dialect.Oracle10gDialect(它扩展了 9i 和 8i)。看起来你有

registerColumnType( Types.DOUBLE, "double precision" );
Run Code Online (Sandbox Code Playgroud)

因此,表需要定义为double precision,并且 java 类需要定义为Types.Double通常映射到 的内容double

从错误消息来看,您的表似乎被定义为float将使用此映射

registerColumnType( Types.FLOAT, "float" );
Run Code Online (Sandbox Code Playgroud)

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

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

嗯。


小智 5

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

@Column(name = "PERFORMANCE", columnDefinition = "FLOAT(5,2)")
private double performance;
Run Code Online (Sandbox Code Playgroud)