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.
需要更多信息。桌子是双人的?我对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)
| 归档时间: |
|
| 查看次数: |
21919 次 |
| 最近记录: |