【问题标题】:Hibernate: Found: float, expected: double precision休眠:找到:浮点数,预期:双精度
【发布时间】:2011-02-01 06:28:54
【问题描述】:

我在将 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
- 休眠核心 3.3.1.GA
- 甲骨文10g

【问题讨论】:

  • 您能否展示一下您实际上是如何映射此列的?顺便说一句,注意到您在投入生产前的最后几分钟,您只需确保在适当的时候就您的马虎测试您的应用程序得到诙谐的评论:-)
  • 哈哈 :) 别担心,我在生产方面并不马虎。只要不修,就不会熄灭。无论如何,这是我同事遇到的一个错误,我只是想帮助他。好话虽然:)
  • 我根据您的建议编辑了我的问题。谢谢。
  • 恐怕你在这里走错路了。 Oracle SQL 没有任何数据类型,例如 double 或 float。列唯一允许的数字数据类型是NUMBER。您可以使用 BINARY_DOUBLE 类型的参数调用 PL/SQL 过程,但这是不同的,这种数据类型不能存储在数据库中。如果您想安全起见,请将 Oracle 的 NUMBER(作为其子类型)映射到 Java 的 BigDecimal。

标签: hibernate validation grails database-schema


【解决方案1】:

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

public class Oracle10gDialectExtended extends Oracle10gDialect {

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

最后在 Hibernate/JPA 配置中注册Oracle10gDialectExtendedhibernate.dialect

【讨论】:

  • 在 hibernate.cfg.xml 文件中添加 Oracle10gDialectExtended 类不起作用:Oracle10gDialectExtended跨度>
【解决方案2】:

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

@Column(name = "PERFORMANCE", columnDefinition = "FLOAT(5,2)")
private double performance;

【讨论】:

    【解决方案3】:

    需要更多信息。桌子是双人的?我不熟悉 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" );
    

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

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

    hth.

    【讨论】:

      【解决方案4】:

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

      <property name="performance" type="double">
        <column name="PERFORMANCE" sql-type="float" />
      </property>
      

      【讨论】:

        【解决方案5】:

        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");
            }
        }
        

        【讨论】:

          【解决方案6】:

          我的 Oracle 列类型是 NUMBER,而 Java 类型是 double

          终于查到是设置问题

          &lt;property name="hbm2ddl.auto"&gt;validate&lt;/property&gt;

          刚刚改成

          &lt;property name="hbm2ddl.auto"&gt;update&lt;/property&gt;

          一切正常!

          【讨论】:

            【解决方案7】:

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

            Result.groovy

            class Result{
                Double discount
            
                static mapping = {
                    discount column: "discount", sqlType: "float"
                }
            
                static constraints = {
                    discount(nullable: true)
                }
            }
            

            所以它会消除验证模式下的错误。

            【讨论】:

              【解决方案8】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2018-02-23
                • 2018-07-06
                • 2014-12-09
                • 1970-01-01
                • 2023-03-31
                • 2011-05-17
                • 1970-01-01
                相关资源
                最近更新 更多