Jas*_*vak 18 java oracle orm hibernate
我有几个带有双字段的Java类,我通过Hibernate持久化.例如,我有
@Entity
public class Node ...
private double value;
Run Code Online (Sandbox Code Playgroud)
当Hibernate org.hibernate.dialect.Oracle10gDialect为Node表创建DDL时,它会将value字段映射为"double precision"类型.
create table MDB.Node (... value double precision not null, ...
Run Code Online (Sandbox Code Playgroud)
看起来在Oracle中,"double precision"是"float"的别名.因此,当我尝试使用该org.hibernate.cfg.AnnotationConfiguration.validateSchema()方法验证数据库模式时,Oracle似乎将值列描述为"float".这会导致Hibernate抛出以下异常
org.hibernate.HibernateException: Wrong column type in DBO.ACL_RULE for column value. Found: float, expected: double precision
Run Code Online (Sandbox Code Playgroud)
Hibernate的JIRA数据库中列出了一个非常类似的问题,如HHH-1961.我想避免做任何会破坏MySql,Postgres和Sql Server支持的事情,因此扩展Oracle10gDialect似乎是HHH-1961中提到的最有希望的解决方法.但延伸一个方言是我以前从未做过的事情,我担心可能会有一些讨厌的问题.这个问题的最佳解决方法是什么,不会破坏我们与MySql,Postgres和Sql Server的兼容性?
Pas*_*ent 21
这是模式验证器的已知限制,请查看HHH-2315.所以你在这里有三个选项(实际上是四个,但我想不需要停用验证).或者:
在Java级别使用a float而不是a double- 但这可能不是一个选项.
补丁org.hibernate.mapping.Table.validateColumns(Dialect dialect, Mapping mapping, TableMetadata tableInfo)为这个特殊情况添加一个特殊条件 - 这不是一个轻松的选择.
扩展org.hibernate.dialect.Oracle10gDialect以使其float用于SQL类型DOUBLE
public class MyOracle10gDialect extends Oracle10gDialect {
public MyOracle10gDialect() {
super();
}
protected void registerNumericTypeMappings() {
super.registerNumericTypeMappings();
registerColumnType( Types.DOUBLE, "float" );
}
}
Run Code Online (Sandbox Code Playgroud)后一个选项似乎是安全的,但需要进行一些测试,看看它是否没有引入任何回归.我没有看过Oracle的JDBC驱动程序代码,所以我不能说驱动程序级别如何float和double precision不同.
小智 6
只需添加(columnDefinition ="NUMBER(9,2)")即可使用!
@Column(name = "CREDIT_AMOUNT", columnDefinition = "NUMBER(9,2)")
@Basic
private double creditAmount;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9584 次 |
| 最近记录: |