Hibernate 休眠:找到:浮点,应为:双精度
我在将Oracle浮点双精度数据类型映射到Java双精度数据类型时遇到问题。当使用JavaDouble数据类型时,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 避免这种情况的唯一方法是禁用模式验证,并希望模式与即将运行的应用程序同步。在投入生产之前,必须把
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)
}
}