Hibernate 休眠:找到:浮点,应为:双精度

Hibernate 休眠:找到:浮点,应为:双精度,hibernate,validation,grails,database-schema,Hibernate,Validation,Grails,Database Schema,我在将Oracle浮点双精度数据类型映射到Java双精度数据类型时遇到问题。当使用JavaDouble数据类型时,hibernate模式验证程序似乎失败 org.hibernate.HibernateException: Wrong column type in DB.TABLE for column amount. Found: float, expected: double precision 避免这种情况的唯一方法是禁用模式验证,并希望模式与即将运行的应用程序同步。在投入生产之前,必须把

我在将Oracle浮点双精度数据类型映射到Java双精度数据类型时遇到问题。当使用JavaDouble数据类型时,hibernate模式验证程序似乎失败

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需要更多信息。这张桌子是双人的吗?我不熟悉Oracle,但它是浮点类型吗?它转换成什么类型?您可以在数据库的方言类中看到
java.sql.Types
到数据库类型的映射。在本例中,它是
org.hibernate.dialent.oracle10galent
(扩展了9i和8i)。看起来你有

registerColumnType( Types.DOUBLE, "double precision" );
因此,表需要定义为
double-precision
,java类需要定义为映射到
类型的东西。double
,通常是
double

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

registerColumnType( Types.FLOAT, "float" );
预期的java类型将映射到
类型.FLOAT
,通常是
FLOAT
;单个精度值

最简单的方法是更改表或java类以匹配。或者,您可以指定将单精度值映射为双精度值的用户类型;我想不出你为什么真的想这么做,但是如果你不能同时控制课堂和桌子的话,我想这是非常罕见的


嗯。

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

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

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

最后,我们发现这是由于环境造成的

验证

刚改成

更新


一切都成功了

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

public class Oracle10gDialectExtended extends Oracle10gDialect {

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

最后,在Hibernate/JPA配置中将
Oracle10gDialogExtended
注册为
Hibernate.dialogue

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

如果使用注释方法,则需要为字段声明列类型,如下所示

@Column(name = "PERFORMANCE", columnDefinition = "FLOAT(5,2)")
private double performance;
应用程序属性

hibernate.dialent=com.test.config.oracle10glated

创建类


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

Result.groovy中

class Result{
    Double discount

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

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

因此,它将删除验证模式中的错误。

能否显示您实际如何映射此列?顺便说一句,在开始制作前的最后几分钟,你只需确保在适当的时候得到关于你的草率的诙谐评论,以测试你的应用程序:-)哈哈:)别担心,我在制作方面不是草率的。只要没有修好,它就不会熄灭。不管怎样,我的一个同事遇到了一个bug,我只是想帮助他。不过这句话很好:)我根据你的建议编辑了我的问题。谢谢。恐怕你走错了方向。Oracle SQL不支持任何数据类型,如double或float。列唯一允许的数字数据类型是
NUMBER
。您可以使用BINARY_DOUBLE类型的参数调用PL/SQL过程,但这是不同的,这种数据类型不能存储在数据库中。如果您想安全起见,请将Oracle的数字(作为其子类型)映射到Java的BigDecimal
class Result{
    Double discount

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

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